空间相似性警告:“基于空向量评估文档相似性。”

时间:2019-04-30 12:35:07

标签: python-3.x nlp pytorch spacy wordnet

我正在尝试使用FAQ数据集进行数据增强。我用import spacy import nltk from nltk.corpus import wordnet as wn import pandas as pd nlp = spacy.load('en_core_web_md') nltk.download('wordnet') questions = pd.read_csv("FAQ.csv") list_questions = [] for question in questions.values: list_questions.append(nlp(question[0])) for question in list_questions: for token in question: treshold = 0.5 if token.pos_ == 'NOUN': wordnet_syn = wn.synsets(str(token), pos=wn.NOUN) for syn in wordnet_syn: for lemma in syn.lemmas(): similar_word = nlp(lemma.name()) if similar_word.similarity(token) != 1. and similar_word.similarity(token) > treshold: good_word = similar_word treshold = token.similarity(similar_word) 来检查大多数与Spacy的相似性,从而将单词(特别是名词)更改为最相似的单词。我使用多个for循环遍历我的数据集。

similar_word.similarity(token)

但是,以下警告多次打印,但我不明白为什么:

  

UserWarning:[W008]基于空向量评估文档相似度。

是我的list_questions = [Do you have a paper or other written explanation to introduce your model's details?, Where is the BERT code come from?, How large is a sentence vector?]造成了问题,但我不明白为什么。 我的list_questions的形式是:

similar_word

我需要检查令牌,还需要检查循环中的tokens = nlp(u'dog cat unknownword') similar_word = nlp(u'rabbit') if(similar_word): for token in tokens: if (token): print(token.text, similar_word.similarity(token)) ,例如,我仍然在这里得到错误:

 123,456,789.12   

2 个答案:

答案 0 :(得分:1)

similar_word不是有效的伪造文档时,您会收到该错误消息。例如。这是一个最小的可重现示例:

import spacy

nlp = spacy.load('en_core_web_md')  # make sure to use larger model!
tokens = nlp(u'dog cat')
#similar_word = nlp(u'rabbit')
similar_word = nlp(u'')

for token in tokens:
  print(token.text, similar_word.similarity(token))

如果将''更改为'rabbit',则可以正常使用。 (显然,猫与狗的相似性只是狗的一小部分!)

更新:正如您所指出的那样,未知单词也会触发警告;它们将是有效的伪造对象,但没有任何单词向量。)

因此,一种解决方法是在调用similar_word之前检查similarity()是否有效,包括具有有效的单词向量:

import spacy

nlp = spacy.load('en_core_web_md')  # make sure to use larger model!
tokens = nlp(u'dog cat')
similar_word = nlp(u'')

if(similar_word and similar_word.vector_norm):
  for token in tokens:
    if(token and token.vector_norm):
      print(token.text, similar_word.similarity(token))

替代方法:

您可以禁止显示特定警告。是W008。我相信在运行脚本之前设置环境变量SPACY_WARNING_IGNORE=W008可以做到。 (未经测试。)

(请参见source code


顺便说一句,similarity()可能会导致一些CPU负载,因此值得将其存储在变量中,而不是像当前那样计算三遍。 (有人可能会认为这是过早的优化,但我认为这也可能使代码更具可读性。)

答案 1 :(得分:0)

我已通过在运行文件中使用此代码来设置环境变量来抑制W008警告。

import os
app = Flask(__name__)

app.config['SPACY_WARNING_IGNORE'] = "W008"
os.environ["SPACY_WARNING_IGNORE"] = "W008"

if __name__ == "__main__":
app.run(host='0.0.0.0', port=5000)