我正在尝试查找5个单词的列表和3500个单词的列表之间的单词相似度。
我面临的问题:
我的5个单词的列表如下
List_five =['cloud','data','machine learning','virtual server','python']
在3500个单词的列表中,有类似
的单词 List_threek =['cloud computing', 'docker installation', 'virtual server'.....]
Spacy模型通过其“ nlp”对象似乎将第二个列表中的令牌分解为云,计算,记录,安装。
这反过来导致相似的单词出现不正确,例如,当我运行以下代码时
tokens = " ".join(List_five)
doc = nlp(tokens)
top5 = " ".join(List_threek)
doc2 = nlp(top5)
similar_words = []
for token1 in doc:
list_to_sort = []
for token2 in doc2:
#print(token1, token2)
list_to_sort.append((token1.text, token2.text, token1.similarity(token2)))
我得到了预期的结果(云,云计算),例如(云,云)。看起来“云计算”一词被分为两个单独的令牌。
有没有解决方法?任何帮助表示赞赏。
我想要一个例外,即上下文相关的词(例如“云计算”)不会分成两个词(例如“ cloud”(云计算),“ computing”(计算)),而是保留为“ cloud computing(云计算)”
答案 0 :(得分:3)
Spacy还可以让您进行文档相似性(平均单词嵌入的单词,但这要比您现在做的要好)-因此,一种解决方法是直接比较list1和list2中的项目而不做标记通过令牌。例如,
import spacy
nlp = spacy.load('en_core_web_sm')
l1 =['cloud','data','machine learning','virtual server','python']
l2=['cloud computing', 'docker installation', 'virtual server']
for item1 in l1:
for item2 in l2:
print((item1, item2), nlp(item1).similarity(nlp(item2)))
这将向我显示以下内容:
('cloud', 'cloud computing') 0.6696009166814865
('cloud', 'docker installation') 0.6003896898695236
('cloud', 'virtual server') 0.5484600148958506
('data', 'cloud computing') 0.3544642116905426
('data', 'docker installation') 0.4123695793059489
('data', 'virtual server') 0.4785382246303466
... and so on.
这是您想要的吗?