2014-11-30 15 views
6

Ho una configurazione del database di wordnet e sto cercando di generare sinonimi per varie parole.Utilizzo di Wordnet per generare superlativi, comparativi e aggettivi

Ad esempio, la parola "massimo". Esaminerò e troverò diversi sinonimi, ma nessuno di essi si adatta alla definizione, ad esempio uno è "superlativo".

Immagino di dover eseguire una sorta di controllo per frequenza in una determinata lingua o di generare una parola per ottenere la parola di base (ad esempio, massima -> ottima, ottima -> la migliore).

Quale tabella dovrei utilizzare per garantire che le mie parole abbiano un minimo di senso?

+0

Lemmatize, non staminali. Inoltre, potresti approfondire "quale tavolo ... senso?" –

+0

Probabilmente il più grande può essere distribuito da un tagger di parte della giuria, vedere JJ, JJR, JJS qui https://gate.ac.uk/sale/tao/splitap7.html#x39-802000G. Come un suggerimento davvero inverosimile, è possibile esaminare le parole d'ordine: https://code.google.com/p/word2vec/ Le parole di chiusura non sono sinonimi, ma forse la regolazione del modello e la formazione sui dati corretti potrebbero generare sinonimi . Oppure ottieni l'intersezione tra i risultati del thesaurus e i gruppi di parole. – Yasen

risposta

4

Né Stemmer o lemmatizer si può ottenere da 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' 

Ma sembra che si può fare uso di alcune belle proprietà della insieme di tag PennTreeBank per arrivare da greatest -> great:

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

Proviamo un pazzo sistema basato su regole, partiamo da 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' 

Ora che sappiamo che possiamo costruire il nostro piccolo superlativo stemmer/lemmatizer/tail_substituter, scriviamo una regola che dice se una parola dà un tag POS superlativo e il nostro tail_substituter ci dà JJ quando ci deriva e JJR quando convertiamo, possiamo tranquillamente dire che la forma comparativa e la base della parola può essere facilmente ottenuto con la nostra 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' 

Ora che si ottiene da greatest -> greater -> great. Da great -> best è un po 'strano, dal momento che lessicalmente non sono correlati anche se il loro parente relativo alla semantica sembra correlato.

quindi penso che sarebbe soggettivo dire che great -> best è una trasformazione valida

+0

In realtà non sto usando NLTK, ma Wordnet è stato convertito in un database MySQL. Ma esaminerò questo - questa sembra una soluzione ragionevole. –

Problemi correlati