python - 在 SpaCy 上计算文本的平均向量
问题描述
我正在使用 SpaCy 计算几个文档之间的距离,我的方法如下:
1)将文本转换为一个spacy对象 2)删除停用词 3)对于剩余的每个词,获取向量表示并计算平均值。4) 使用几种方法来测量文档之间的距离。
我对这种方法的问题是大文件需要很长时间。
我发现 spacy 有一种方法,称为相似性,可以更快地执行此操作:
nlp_latin = spacy.load("/tmp/la_vectors_wiki_lg")
doc1 = nlp_latin(u"Caecilius est in horto")
doc2 = nlp_latin(u"servus est in atrio")
doc1.similarity(doc2)
但它只使用余弦距离,有没有一种方法只返回文档的平均向量?
解决方案
只是为该线程的未来访问者扩展上述评论中的答案:
根据SpaCy 文档,Doc
SpaCy 中的类具有vector
返回其标记向量平均值的属性。
对于您的用例,在加载 SpaCy 后,以下代码将为您提供拉丁文本“Caecilius est in horto”的平均向量
doc = nlp_latin(u"Caecilius est in horto")
doc.vector
提高性能的旁注:
- 即使您只使用 SpaCy 管道的标记器组件,SpaCy 也会在您调用
spacy.load
. 因此,加载它们会显着降低性能。exclude
为了解决这个问题,您可以通过将参数添加到函数中来排除这些额外的组件spacy.load
,如下所示(有关更多信息,请查看Spacy 关于处理管道的文档。):
nlp_latin = spacy.load("/tmp/la_vectors_wiki_lg", exclude=["parser", "ner", "tagger", "textcat"])
- 同样,由于您仅使用 SpaCy 将原始文本转换为标记,因此您可以将
nlp_latin
函数调用替换为nlp_latin.make_doc
. 可以像以前一样检索平均令牌向量doc.vector
。这确保 SpaCy 仅在 nlp_latin 调用后使用标记器,从而使您的代码更快。有关更多信息,请查看此链接的扩展和性能部分
推荐阅读
- html - 简单html签名中图像右侧的1px垂直间隙
- r - R包:如何不显示所有功能
- android-studio - Android Studio 丢失了运行配置
- google-compute-engine - gcloud:如何获取托管实例组的 IP 地址
- postgresql - 使用 DECODE 时是否有处理“无效的十六进制数字”的好方法?
- pdf - 我可以链接整个 IFrame 而不链接其内容吗?
- jasper-reports - 重复 JasperReport 与同一页面中的详细信息带
- c# - 为什么c#中无法执行数据库验证码
- postgresql - PostgreSQL 区间减法
- c++ - 是否有不使用 ptrdiff_t 作为其差异类型的迭代器示例?