python-3.x - Spacy相似警告: "Evaluating Doc.similarity based on empty vectors."

标签 python-3.x nlp pytorch spacy wordnet

我正在尝试使用常见问题解答数据集进行数据增强。我通过使用 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)

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

UserWarning: [W008] Evaluating Doc.similarity based on empty vectors.

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

list_questions = [您有论文或其他书面解释来介绍您的模型的详细信息吗?、BERT 代码来自哪里?、句子向量有多大?]

我需要检查 token ,但也需要检查循环中的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))

最佳答案

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))

如果将''更改为'rabbit',它就可以正常工作。 (显然,猫与兔子的相似度显然只是比狗更相似一点!)

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

因此,一种修复方法是在调用 similarity() 之前检查 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'')

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 负载,因此值得存储在变量中,而不是像当前那样计算三次。 (有些人可能会认为这是不成熟的优化,但我认为这也可能使代码更具可读性。)

关于python-3.x - Spacy相似警告: "Evaluating Doc.similarity based on empty vectors.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55921104/

相关文章:

python - 如何避免双引号字符串、站点 URL 和电子邮件地址进行标记化

python - 张量 a (707) 的大小必须与非单维 1 处的张量 b (512) 的大小匹配

lua - 将 torch t7 模型转换为 pytorch

pytorch - Tensorboard 简历训练图

python - 在 Django Rest-framework 中定义之前引用序列化程序类

python-3.x - Lattice Diamond 命令行工具不知道 'synthesis' 命令

r - 如何使用 gsub() 准确替换字符串

python - 为 Python 3 安装 ipdb?

python - += : 'NoneType' and 'list' 不受支持的操作数类型

python - 查找并替换为以小写字母开头的正确句子案例句子。正则表达式或崇高