Spacy 相似性警告:"Evaluating Doc.similarity based on empty vectors."
Spacy similarity warning : "Evaluating Doc.similarity based on empty vectors."
我正在尝试使用常见问题解答数据集进行数据增强。我用 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 = [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))
当 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 负载,因此值得存储在一个变量中,而不是像现在这样计算三次。 (有些人可能会争辩说这是过早的优化,但我认为这也可能使代码更具可读性。)
我已经通过在 运行 文件中使用此代码设置环境变量来抑制 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)
我正在尝试使用常见问题解答数据集进行数据增强。我用 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 = [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))
当 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 负载,因此值得存储在一个变量中,而不是像现在这样计算三次。 (有些人可能会争辩说这是过早的优化,但我认为这也可能使代码更具可读性。)
我已经通过在 运行 文件中使用此代码设置环境变量来抑制 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)