itemsets的word2vec

itembed的Python项目详细描述


项目集嵌入

这是著名的word2vec方法的另一个变体,由 Mikolov et al.,应用于无序序列,它们是 通常称为项集。itembed的贡献是双重的:

  1. 修改基本算法以处理无序序列,它具有 对上下文窗口定义的影响
  2. 使用word2vec中引入的两个嵌入集进行监督 学习。在

一个类似的哲学是由Wu et al.StarSpace并通过item2vec中的Barkan and Koenigsteinitembed使用Numba实现高性能。在

安装

PyPI安装:

pip install itembed

或从源代码安装,以确保最新版本:

^{pr2}$

入门

项集必须作为所谓的压缩数组提供,即一对整数 描述索引偏移量的数组。索引数组定义为 所有N个项集的串联。偏移数组包含N+1边界。在

importnumpyasnpindices=np.array([0,1,4,7,0,1,6,2,3,5,6,7,],dtype=np.int32)offsets=np.array([0,4,7,12])

这类似于compressed sparse matrices

fromscipy.sparseimportcsr_matrixdense=np.array([[1,1,0,0,1,0,0,1],[1,1,0,0,0,0,1,0],[0,0,1,1,0,1,1,1],],dtype=np.int32)sparse=csr_matrix(dense)assert(indices==sparse.indices).all()assert(offsets==sparse.indptr).all()

训练方法不处理其他数据类型。还要注意:

  • 指数从0开始
  • 项目集中的项目顺序并不重要
  • 项集可以包含重复项
  • 项目集顺序并不重要
  • 没有与项关联的权重,也没有与项集关联的权重。在

但是,为简单情况提供了一个小助手:

fromitembedimportpack_itemsetsitemsets=[['apple','sugar','flour'],['pear','sugar','flour','butter'],['apple','pear','sugar','buffer','cinnamon'],['salt','flour','oil'],# ...]labels,indices,offsets=pack_itemsets(itemsets,min_count=2)num_label=len(labels)

下一步是至少定义一个任务。现在,让我们坚持 无监督的情况下,共现作为知识来源。这是 类似于连续包单词和连续跳转单词任务的定义 在word2vec中。在

首先,必须分配两个嵌入集。两者都应该捕获相同的内容 信息,一个是另一个的补充。这是不可能的 文献记载了word2vec的问题,但实证结果表明它是 相同的集合比重复使用两次要好。在

fromitembedimportinitialize_synnum_dimension=64syn0=initialize_syn(num_label,num_dimension)syn1=initialize_syn(num_label,num_dimension)

其次,定义一个包含所有描述符的任务对象:

fromitembedimportUnsupervisedTasktask=UnsupervisedTask(indices,offsets,syn0,syn1,num_negative=5)

第三,必须多次调用do_batch方法,直到收敛。 提供另一个助手来处理训练循环。注意,由于 不同的采样策略,需要较大的迭代次数。在

fromitembedimporttraintrain(task,num_epoch=100)

因此,完整代码如下:

importnumpyasnpfromitembedimport(pack_itemsets,initialize_syn,UnsupervisedTask,train,)# Get your own itemsetsitemsets=[['apple','sugar','flour'],['pear','sugar','flour','butter'],['apple','pear','sugar','buffer','cinnamon'],['salt','flour','oil'],# ...]# Pack itemsets into contiguous arrayslabels,indices,offsets=pack_itemsets(itemsets,min_count=2)num_label=len(labels)# Initialize embeddings sets from uniform distributionnum_dimension=64syn0=initialize_syn(num_label,num_dimension)syn1=initialize_syn(num_label,num_dimension)# Define unsupervised task, i.e. using co-occurrencestask=UnsupervisedTask(indices,offsets,syn0,syn1,num_negative=5)# Do training# Note: due to a different sampling strategy, more epochs than word2vec are neededtrain(task,num_epoch=100)# Both embedding sets are equivalent, just choose one of themsyn=syn0

更多的例子可以在./example/中找到。见 documentation了解更多详细信息 信息。在

绩效改进

正如Numba文档中的suggested,Intel的短矢量数学库可用于提高性能:

conda install -c numba icc_rt

引文

如果您在工作中使用此软件,请引用此工具,例如使用以下Bibtex参考:

@software{itembed,author={Johan Berdat},title={itembed},url={https://gitlab.com/jojolebarjos/itembed},version={0.4.2},date={2020-06-10},}

参考文献

变更日志

  • 0.4.2-2020年6月10日
    • 干净的文档和示例
    • 错误修复
  • 0.4.1-2020年5月13日
    • 清理并重命名,以避免混淆
  • 0.4.0-2020年5月4日
    • 重构以使培训任务明确化
    • 添加监督任务
  • 0.3.0-2020年3月26日
    • 完成重构以提高性能和可重用性
  • 0.2.1-2020年3月24日
    • 允许键盘中断
    • 修复标签计数参数
    • 修正学习率问题
    • 向Numba JIT添加优化标志
  • 0.2.0-2019年11月8日
    • 清理和重构
    • 允许普通阵列训练
  • 0.1.0-2019年9月13日
    • 初始版本

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java soap在实现applicationContext后失败。xml   java为什么不能解析这个方法?   国际化java。util。MissingResourceException:找不到基名称的捆绑包   当使用SpringJDBC时,用java干净的方式外部化长(+20行sql)?   映射值中的java类型不匹配:应为组织。阿帕奇。hadoop。木卫一。可空写,接收组织。阿帕奇。hadoop。木卫一。文本   java组织。冬眠MappingException:无法确定抽象类表的类型   java如何从子类构造函数调用超类的私有构造函数?   将iBeacon主ID从Java类传递到Android Studio中的活动   与通配符匹配的java KeyValue参数   java用集合实例化多重映射?   java在单独的类中编辑和更新正在运行的实例变量   java Struts html:复选框查询   java日志中西里尔文日志显示不正确   使用apacheavro的javaavro阵列   CacheBuilder中的java NoSuchMethodError(checkState)