Spacy 相似性警告:“基于空向量评估 Doc.similarity。”

Jon*_*nor 5 nlp wordnet python-3.x spacy pytorch

我正在尝试使用 FAQ 数据集进行数据增强。我用最相似的词来改变词,特别是名词,Wordnet检查与 Spacy 的相似性。我使用多个 for 循环来浏览我的数据集。

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)
Run Code Online (Sandbox Code Playgroud)

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

UserWarning:[W008] 基于空向量评估 Doc.similarity。

是我similar_word.similarity(token)造成了问题,但我不明白为什么。我的 list_questions 的形式是:

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?]

我需要检查令牌,但也需要检查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))
Run Code Online (Sandbox Code Playgroud)

Dar*_*ook 11

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

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))
Run Code Online (Sandbox Code Playgroud)

如果您'''rabbit'其更改为它工作正常。(猫显然只是比狗更类似于兔子的一小部分!)

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

因此,一种解决方法是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))
Run Code Online (Sandbox Code Playgroud)

替代方法:

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

(见源代码


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

  • @RidhimaKumar 请参阅 https://docs.python.org/3/library/os.html#os.environ 我*认为*您需要在导入 spacy 之前执行此操作。或者,为了将其设置在脚本之外,我搜索了“windows python 如何设置环境变量”,它找到了各种答案。 (2认同)