Пространство, Странное сходство между двумя предложениями - PullRequest
0 голосов
/ 31 августа 2018

Я скачал en_core_web_lg модель и пытаюсь найти сходство между двумя предложениями:

nlp = spacy.load('en_core_web_lg')

search_doc = nlp("This was very strange argument between american and british person")

main_doc = nlp("He was from Japan, but a true English gentleman in my eyes, and another one of the reasons as to why I liked going to school.")

print(main_doc.similarity(search_doc))

Что возвращает очень странное значение:

0.9066019751888448

Эти два предложения не должны быть 90% похожими , они имеют очень разные значения.

Почему это происходит? Нужно ли добавлять какой-то дополнительный словарь, чтобы результат сходства был более разумным?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Пространство строит вложение предложений, усредняя вложения слов. Поскольку в обычном предложении много бессмысленных слов (называемых стоп-словами ), вы получите плохие результаты. Вы можете удалить их так:

search_doc = nlp("This was very strange argument between american and british person")
main_doc = nlp("He was from Japan, but a true English gentleman in my eyes, and another one of the reasons as to why I liked going to school.")

search_doc_no_stop_words = nlp(' '.join([str(t) for t in search_doc if not t.is_stop]))
main_doc_no_stop_words = nlp(' '.join([str(t) for t in main_doc if not t.is_stop]))

print(search_doc_no_stop_words.similarity(main_doc_no_stop_words))

или сохраняйте только существительные, поскольку у них больше всего информации:

doc_nouns = nlp(' '.join([str(t) for t in doc if t.pos_ in ['NOUN', 'PROPN']))
0 голосов
/ 03 сентября 2018

Документация Spacy для векторного сходства объясняет основную идею этого:
Каждое слово имеет векторное представление, усвоенное с помощью контекстных вложений ( Word2Vec ), которые обучаются на корпусах, как описано в документации.

Теперь вложение слова полного предложения - это просто среднее значение по всем разным словам. Если теперь у вас есть много слов, которые семантически лежат в одной и той же области (как, например, такие слова-наполнители, как «он», «был», «этот», ...), а дополнительный словарь «исключает», то вы может привести к сходству, как видно в вашем случае.

Вопрос по праву в том, что вы можете с этим поделать: с моей точки зрения, вы могли бы придумать более сложную меру подобия. Поскольку search_doc и main_doc имеют дополнительную информацию, например, исходное предложение, вы можете изменить векторы с помощью штрафа на разницу в длине или, альтернативно, попытаться сравнить более короткие фрагменты предложения и вычислить попарные сходства (опять же, вопрос будет какие части сравнивать).

Пока что, к сожалению, нет простого способа решить эту проблему.

...