Я пытаюсь улучшить данные с помощью набора данных часто задаваемых вопросов. Я меняю слова, особенно существительные, на наиболее похожие слова с 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 = [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
не является допустимым пробельным документом. Например. это минимальный воспроизводимый пример:
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
перед запуском вашего скрипта сделает это. (Не испытано.)
(См. исходный код)
Кстати, similarity()
может вызвать некоторую нагрузку на процессор, поэтому стоит сохранить в переменной, а не вычислять ее трижды, как вы делаете сейчас. (Некоторые люди могут возразить, что это преждевременная оптимизация, но я думаю, что это также может сделать код более читабельным.)
@Jonor Вы правы (я пробовал это, но кажется, что бессмысленное слово, которое я использовал, действительно существовало в модели web_md !!) После изучения источника (github.com/explosion/spaCy/blob/…) я обновил свой ответ.
@DarrenCook Как подавить ошибку. Я также сталкиваюсь с той же проблемой. Где следует внести изменения в то, что предлагается. Я мог найти код error.py (ссылка здесь: github.com/explosion/spaCy/blob/…), но не уверен, где именно установить «SPACY_WARNING_IGNORE=W008». Я использую окно 10, IDE: spyder, Spacy 2.2.5. Было бы здорово, если бы вы сказали мне, как и где установить переменную среды "SPACY_WARNING_IGNORE=W008"
@RidhimaKumar См. docs.python.org/3/library/os.html#os.environ I думать, вам нужно будет сделать это, прежде чем импортировать spacy. Или, чтобы установить его вне сценария, я погуглил «Windows python, как установить переменную среды», и нашел разные ответы.
@DarrenCook Спасибо за ваш ответ. Извините за дополнительные разъяснения. «Я думаю, вам нужно будет сделать это, прежде чем импортировать spacy», поэтому, если я правильно понимаю, переменная среды «SPACY_WARNING_IGNORE = W008» может быть установлена в самом моем скрипте Python? (т.е. сценарий, имеющий указанную выше функцию сходства)?
@RidhimaKumar Одним из лучших результатов Google, который я получил, была эта страница StackOverflow: stackoverflow.com/questions/5971312/… (именно это привело меня к этой странице руководства :-)) (PS, если это неясно, то да, я думаю, что все это можно сделать изнутри скрипт python. Я лично не пробовал.)
@DarrenCook Спасибо, я понял.
Я подавил предупреждение 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)
Начиная с spacy 2.3, вы должны использовать стандартный модуль предупреждений от python для фильтрации предупреждений: warnings.filterwarnings("ignore", message=r"\[W008\]", category=UserWarning)
. Как описано в руководстве по миграции: spacy.io/использование/v2-3.
Спасибо за ваш ответ, но я все еще получаю сообщение об ошибке. Мне тоже нужно проверить
token
. Я отредактировал свой пост с вашим примером, чтобы показать вам ошибку.