Почему spacy не может различить два токена гомографа в следующем коде? - PullRequest
0 голосов
/ 09 ноября 2018

Гомограф - это слово, которое имеет то же самое написание, что и другое слово, но имеет другой звук и другое значение, например, lead (перед ним) / свинец (металл) .

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

В коде ниже, почему сходство между двумя 'банком' токены выходят как 1.00 ?

import spacy
nlp = spacy.load('en')

str1 = 'The guy went inside the bank to take out some money'
str2 = 'The house by the river bank.'

str1_tokenized = nlp(str1.decode('utf8'))
str2_tokenized = nlp(str2.decode('utf8'))

token1 = str1_tokenized[-6]
token2 = str2_tokenized[-2]

print 'token1 =  {}  token2 = {}'.format(token1,token2)

print token1.similarity(token2)

Выход для данной программы:

токен1 = банк токен2 = банк

1,0

1 Ответ

0 голосов
/ 10 ноября 2018

Как уже указывал kntgu, spaCy различает токены по их символам, а не по их семантическому значению. Подход sense2vec от разработчиков spaCy объединяет токены с их POS-тегом и может помочь в случае «lead_VERB» против «lead_NOUN». Однако в вашем примере «банк (речной берег)» и «банк (финансовый институт)» это не поможет, так как оба являются существительными.

SpaCy не поддерживает какие-либо решения для этого из коробки, но вы можете взглянуть на контекстуальные представления слов, такие как ELMo или BERT. Оба генерируют векторы слов для данного предложения, принимая во внимание контекст. Поэтому я предполагаю, что векторы для обоих «банковских» токенов будут существенно различаться. Оба являются относительно недавними подходами и не так удобны в использовании, но могут помочь в вашем случае использования. Для ELMo есть инструмент командной строки, который позволяет генерировать вложения слов для набора предложений без необходимости писать код: https://github.com/allenai/allennlp/blob/master/tutorials/how_to/elmo.md#writing-contextual-representations-to-disk

...