Можно ли получить классы в наборе данных Wor dNet? - PullRequest
1 голос
/ 08 мая 2020

Я играю с Wor dNet и пытаюсь решить задачу НЛП.

Мне было интересно, существует ли способ получить список слов, принадлежащих к некоторым большим наборам, таким как «животные» (т.е. собака, кошка, корова и т. д. c.), «страны», «электроника» и т. д. c.

Я считаю, что можно каким-то образом получить этот список, используя гиперонимы.

Дополнительный вопрос: знаете ли вы какой-либо другой способ разбить слова на очень большие классы, кроме «существительного», «прилагательного» и «глагола»? Например, такие классы, как «предлоги», «союзы» и т. Д. c.

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Да, вы просто проверяете, является ли категория гиперонимом данного слова.

from nltk.corpus import wordnet as wn

def has_hypernym(word, category):
    # Assume the category always uses the most popular sense
    cat_syn = wn.synsets(category)[0]

    # For the input, check all senses
    for syn in wn.synsets(word):
        for match in syn.lowest_common_hypernyms(cat_syn):
            if match == cat_syn:
                return True
    return False

has_hypernym('dog', 'animal') # => True
has_hypernym('bucket', 'animal') # => False

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

Что касается вашего вопроса о бонусе, я не понимаю, что вы имеете в виду. Может быть, вам стоит взглянуть на NER или задать новый вопрос.

0 голосов
/ 09 мая 2020

С некоторой помощью polm23 я нашел это решение, которое использует сходство между словами и предотвращает получение неверных результатов, когда имя класса неоднозначно. Идея состоит в том, что Wor dNet можно использовать для сравнения списка words со строкой animal и вычисления оценки сходства. С веб-страницы nltk.org:

Wu-Palmer Similarity: Return a score denoting how similar two word senses are, based on the depth of the two senses in the taxonomy and that of their Least Common Subsumer (most specific ancestor node).

def keep_similar(words, similarity_thr):
    similar_words=[]
    w2 = wn.synset('animal.n.01')

    [similar_words.append(word) for word in words if wn.synset(word + '.n.01').wup_similarity(w2) > similarity_thr ]
    return similar_words

Например, если word_list = ['dog', 'car', 'train', 'dinosaur', 'London', 'cheese', 'radon'], соответствующие баллы будут такими:

0.875
0.4444444444444444
0.5
0.7
0.3333333333333333
0.3076923076923077
0.3076923076923077

Это может легко использоваться для создания списка животных, задав правильное значение similarity_thr

...