Пространственное предупреждение о сходстве: «Оценка Doc. Сходства на основе пустых векторов». - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь улучшить данные с помощью набора часто задаваемых вопросов.Я изменяю слова, в частности, существительные, на большинство похожих слов с помощью Wordnet, проверяя сходство с Spacy.Я использую несколько для цикла, чтобы пройти через мой набор данных.

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] Оценка Doc. Сходства на основе пустых векторов.

Это моя 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))

1 Ответ

2 голосов
/ 01 мая 2019

Вы получаете это сообщение об ошибке, когда 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() может вызвать некоторую нагрузку на процессор, поэтому стоит сохранить в переменной, вместо того, чтобы вычислять ее три раза, как вы это делаете в настоящее время. (Некоторые люди могут утверждать, что это преждевременная оптимизация, но я думаю, что это также может сделать код более читабельным.)

...