在Spacy令牌生成器中添加例外,以免用空格破坏令牌?

时间:2018-11-03 07:59:16

标签: python-3.x nlp spacy cosine-similarity word-embedding

我正在尝试查找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(云计算)”

1 个答案:

答案 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.

这是您想要的吗?