2014-11-30 24 views
6

Mam konfigurację bazy danych WordNet i próbuję wygenerować synonimy dla różnych słów.Używanie Wordnet do generowania superlatyw, porównawczych i przymiotników

Na przykład słowo "największy". Przeanalizuję i znajdę kilka różnych synonimów, ale żaden z nich nie pasuje do definicji - na przykład jeden jest "superlatywny".

Zgaduję, że muszę wykonać jakąś kontrolę częstotliwością w danym języku lub wyrazem, aby uzyskać podstawowe słowo (na przykład, największe -> świetne, świetne -> najlepsze).

Jakiego stołu powinienem używać, aby zapewnić, że moje słowa będą miały odrobinę sensu?

+0

Lemmatize, nie wynikają. Czy mógłbyś także rozwinąć temat "jaki stół ... sens?" –

+0

Największy do świetności może prawdopodobnie zostać przekazany przez taggera częściowego, patrz JJ, JJR, JJS tutaj https://gate.ac.uk/sale/tao/splitap7.html#x39-802000G. Jako bardzo daleko idąca sugestia, możesz zajrzeć do osadzania słów: https://code.google.com/p/word2vec/ Zamknięte słowa nie są synonimami, ale być może dostosowanie modelu i szkolenie na właściwych danych może wygenerować synonimy . Lub uzyskaj przecięcie wyników tezaurusa z klastrami słów. – Yasen

Odpowiedz

4

Ani stemmer lub lemmatizer może Ci z greatest ->great:

>>> from nltk.stem import WordNetLemmatizer 
>>> from nltk.stem import WordNetLemmatizer, PorterStemmer 
>>> porter = PorterStemmer() 
>>> wnl = WordNetLemmatizer() 
>>> greatest = 'greatest' 
>>> porter.stem(greatest) 
u'greatest' 
>>> wnl.lemmatize(greatest) 
'greatest' 
>>> greater = 'greater' 
>>> wnl.lemmatize(greater) 
'greater' 
>>> porter.stem(greater) 
u'greater' 

Ale wydaje się, że można skorzystać z kilku przyjemnych właściwości tagset PennTreeBank dostać od greatest -> great:

>>> from nltk import pos_tag 
>>> pos_tag(['greatest']) 
[('greatest', 'JJS')] 
>>> pos_tag(['greater']) 
[('greater', 'JJR')] 
>>> pos_tag(['great']) 
[('great', 'JJ')] 

Spróbujmy zwariowanego systemu opartego na regułach, zacznijmy od greatest:

>>> import re 
>>> word1 = 'greatest' 
>>> re.sub('est$', '', word1) 
'great' 
>>> re.sub('est$', 'er', word1) 
'greater' 
>>> pos_tag([re.sub('est$', '', word1)])[0][1] 
'JJ' 
>>> pos_tag([re.sub('est$', 'er', word1)])[0][1] 
'JJR' 
>>> word1 
'greatest' 

Teraz, gdy wiemy, że możemy zbudować własny, mały superlatywowy łodyg/lemmatizer/tail_substituter, napiszmy regułę, która mówi, że jeśli słowo daje superlatywowy znacznik POS, a nasz tail_substituter daje nam JJ, gdy się wywodzi i JJR, kiedy konwertujemy, możemy śmiało powiedzieć, że baza porównawcza i forma słowa można łatwo zdobyć z naszymi tail_substituter:

>>> if pos_tag([word1])[0][1] == 'JJS' \ 
... and pos_tag([re.sub('est$', '', word1)])[0][1] == 'JJ' \ 
... and pos_tag([re.sub('est$', 'er', word1)])[0][1] == 'JJR': 
...  comparative = re.sub('est$', 'er', word1) 
...  adjective = re.sub('est$', '', word1) 
... 
>>> adjective 
'great' 
>>> comparative 
'greater' 

teraz, gdy dostaje od greatest -> greater -> great. Od great -> best jest trochę dziwne, ponieważ leksykalnie nie są one spokrewnione, chociaż ich relacja semantyczna wydaje się być powiązana.

więc myślę, że byłoby to subiektywna powiedzieć, że jest to ważny great -> best transformacja

+0

W rzeczywistości nie używam NLTK, ale Wordnet jest konwertowany do bazy danych MySQL. Ale przyjrzę się temu - wydaje się rozsądnym rozwiązaniem. –