Все сходства, которые ваш код извлекает, 0.0
, поэтому сортировка списка не имеет никакого эффекта.
Вы воспринимаете "type_of" как слово (точнее, lexeme ), и предполагая, что spaCy будет понимать это как фразу"тип".Обратите внимание, что у первого есть подчеркивание, а у второго нет;однако даже без подчеркивания это не лексема в словаре модели.Поскольку модель не имеет достаточных данных для «type_of» для оценки сходства, оценка составляет 0.0
для каждого сравниваемого слова.
Вместо этого можно создать Span
от слова «тип» и назовите similarity()
на этом.Для этого требуется лишь небольшое изменение кода:
import spacy
def get_related(span): # this now expects a Span instead of a Lexeme
filtered_words = [w for w in span.vocab if
w.is_lower == span.text.islower()
and w.prob >= -15] # filter by probability and case
# (use the lowercase words if and only if the whole Span is in lowercase)
similarity = sorted(filtered_words,
key=lambda w: span.similarity(w),
reverse=True) # sort by the similarity of each word to the whole Span
return similarity[:10] # return the 10 most similar words
nlp = spacy.load('en_core_web_lg') # load the model
print([w.lower_ for w in get_related(nlp(u'type')[:])]) # print related words for "type"
print([w.lower_ for w in get_related(nlp(u'type of')[:])]) # print related words for "type of"
Вывод:
['type', 'types', 'kind', 'sort', 'specific', 'пример', 'особый', 'похожий', 'другой', 'стиль']
['type', 'of', 'types', 'kind', 'specific', 'sort',' другой ',' такой ',' один и тот же ',' связанный ']
Как видите, все слова в некоторой степени связаны с входными данными, а выходные данные похожи, ноне идентичны для «типа» и «типа».