itemsets的word2vec
itembed的Python项目详细描述
项目集嵌入
这是著名的word2vec方法的另一个变体,由 Mikolov et al.,应用于无序序列,它们是 通常称为项集。itembed的贡献是双重的:
- 修改基本算法以处理无序序列,它具有 对上下文窗口定义的影响
- 使用word2vec中引入的两个嵌入集进行监督 学习。在
一个类似的哲学是由Wu et al.在 StarSpace并通过item2vec中的Barkan and Koenigstein。 itembed使用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日
- 初始版本
- 项目
标签: