Открытие таксономических отношений со Spacy - PullRequest
0 голосов
/ 29 октября 2018

Как мы можем сделать общий вывод о таксономических отношениях между сущностями из текста?При поиске слов, близких к «типу» в word2vec модели en_core_web_lg, все они кажутся не связанными.Однако слова «тип» больше похожи на него.Но как я могу использовать общие фразы в моем тексте и применить некоторое общее сходство для вывода таксономии из троек SVO и т. Д.?Может использовать подход типа Sense2Vec, но задается вопросом, можно ли использовать что-то существующее без нового обучения.

Вывод кода ниже:

['eradicate', 'wade', 'equator', 'educated', 'lcd', 'byproducts', 'two', 'propensity', 'rhinos', 'procrastinate']

 def get_related(word):
        filtered_words = [w for w in word.vocab if w.is_lower == word.is_lower and w.prob >= -15]
        similarity = sorted(filtered_words, key=lambda w: word.similarity(w), reverse=True)
        return similarity[:10]

print ([w.lower_ for w in get_related(nlp.vocab[u'type_of'])])

1 Ответ

0 голосов
/ 29 октября 2018

Все сходства, которые ваш код извлекает, 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',' другой ',' такой ',' один и тот же ',' связанный ']

Как видите, все слова в некоторой степени связаны с входными данными, а выходные данные похожи, ноне идентичны для «типа» и «типа».

...