Есть ли в NLTK функциональность "это тип"? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь поймать вхождения общих классов объектов, используя NLTK. Например, trout и herring являются типами fish, eagles и sparrows являются типами birds. Есть ли какая-либо функциональность в NLTK (или любой другой библиотеке в этом отношении), чтобы помочь мне сделать это?

Я не ищу синонимы, поскольку они являются просто еще одним способом сказать то же самое ... поэтому, например, используя wordnet.synsets, я получаю следующее как синонимы для 'воробья':

'hedge_sparrow', 'dunnock', 'Prunella_modularis', 'sparrow', 'true_sparrow'.

А за синонимы «птица» я получаю:

'doll', 'snort', 'skirt', 'birdwatch', 'chick', 'hiss', 'hoot', 'raspberry', 'bird', 'Bronx_cheer', 'boo', 'shuttlecock', 'razzing', 'birdie', 'shuttle', 'wench', 'fowl', 'dame', 'razz'.

Я ищу способ сказать, что sparrow это тип bird.

Ответы [ 2 ]

1 голос
/ 14 апреля 2019

Я восхищаюсь вашей изобретательностью, пытаясь использовать показатель сходства Wordnet, но сомневаюсь, что этого будет достаточно для ваших целей.Вам нужно отношение hypernym , и синтаксис Wordnet удобно предоставляет его с помощью метода hypernyms().(У лемм также есть метод hypernyms(), по некоторым причинам; но он всегда пуст; не позволяйте ему сбить вас с толку.)

Вот что Wordnet может сказать вам о слове «воробей»:

>>> from nltk.corpus import wordnet as wn
>>> wn.synsets("sparrow")
[Synset('sparrow.n.01'), Synset('hedge_sparrow.n.01')]
>>> sparrow = wn.synsets("sparrow")[0]
>>> sparrow.hypernyms()
[Synset('passerine.n.01')]
>>> sparrow.hypernyms()[0].hypernyms()
[Synset('bird.n.01')]
>>> sparrow.hypernyms()[0].hypernyms()[0].hypernyms()
[Synset('vertebrate.n.01')]

Как видите, Wordnet переносит вас от воробей до птица за два шага, а не за один.Это именно то, что содержит Wordnet.

В целом, вы ищете таксономию всего в вашем корпусе, то есть иерархический словарь всех интересных концепций в вашей области.Обратите внимание, что я продолжаю квалифицироваться, как в «вашем корпусе», «вашем домене».Есть много разных способов классифицировать вещи по «типу».Пшеница - это растение, но вы также можете сказать, что это зерновое зерно (подтип растения) или что это семя, пищевой продукт, ингредиент в пищевых продуктах и ​​т. Д. (Не говоря уже о том, что «пшеница»также цвет и т. д.)

Таким образом, идеальным решением для ваших нужд является таксономия вещей, которые вас интересуют, и , подходящих для ваших целей. Если вы имеете дело с конкретным доменом, вполне может быть один;попробуйте поискать в Google или попросить обменять подходящие стеки.Но многие такие ресурсы представлены в формате RDF и требуют иных инструментов и методов, чем те, к которым вы привыкли.Один огромный бесплатный ресурс - dbpedia , извлеченный из Википедии.Вот запись о глотать , чтобы дать вам представление.

0 голосов
/ 13 апреля 2019

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

Оказывается, есть функция синонима path_similarity(), которая дает сходство между двумя синонимами wordnet. Я написал функцию, чтобы найти сходство между всеми комбинациями синонимов для двух элементов и принял наибольшее значение сходства. Мне придется установить порог сходства, выше которого я могу считать одну вещь типом другую вещь.

from nltk.corpus import wordnet

def getSimilarity(thing1, thing2):
    similarity = []
    for syn1 in wordnet.synsets(thing1):
        for syn2 in wordnet.synsets(thing2):
            sim = syn1.path_similarity(syn2)
            if sim:
                similarity.append(sim)
    return max(similarity)

print('fish<->fish similarity: {}'.format(getSimilarity('fish', 'fish')))
print('fish<->trout similarity: {}'.format(getSimilarity('fish', 'trout')))
print('fish<->herring similarity: {}'.format(getSimilarity('fish', 'herring')))
print('fish<->cat similarity: {}'.format(getSimilarity('fish', 'cat')))
print('fish<->dog similarity: {}'.format(getSimilarity('fish', 'dog')))
print('..........')
print('bird<->bird similarity: {}'.format(getSimilarity('bird', 'bird')))
print('bird<->sparrow similarity: {}'.format(getSimilarity('bird', 'sparrow')))
print('bird<->eagle similarity: {}'.format(getSimilarity('bird', 'eagle')))
print('bird<->cat similarity: {}'.format(getSimilarity('bird', 'cat')))
print('bird<->fish similarity: {}'.format(getSimilarity('bird', 'fish')))

Выход:

fish<->fish similarity: 1.0
fish<->trout similarity: 0.5
fish<->herring similarity: 0.3333333333333333
fish<->cat similarity: 0.2
fish<->dog similarity: 0.2
..........
bird<->bird similarity: 1.0
bird<->sparrow similarity: 0.3333333333333333
bird<->eagle similarity: 0.3333333333333333
bird<->cat similarity: 0.25
bird<->dog similarity: 0.25
..........
bird<->fish similarity: 0.25
...