2014-11-30 23 views
6

Bir wordnet veritabanı kurulumum var ve çeşitli kelimeler için eş anlamlı kelimeler oluşturmaya çalışıyorum. Örneğin, "en büyük" sözcüğü. Birkaç farklı eşanlamlıya bakıp bulacağım, ama bunların hiçbiri tanıma uymuyor - örneğin, bir tanesi "üstün".Üstün, karşılaştırmalı ve sıfatlar oluşturmak için Wordnet'i kullanma

Belirli bir dilde frekansa göre bir çeşit kontrol yapmam gerektiğini veya temel kelimeyi elde etmek için bir kelimeyi (örneğin, en iyi -> harika, harika -> en iyi) elde etmem gerektiğini tahmin ediyorum.

Sözlerimin bir miktar mantıklı olmasını sağlamak için hangi masayı kullanmalıyım?

+0

Lemmatize, kök olmayan geçerli bir dönüşüm olduğunu söylemek sübjektif olacağını düşünüyorum. Ayrıca, "hangi masa ... duyu?" –

+0

Muhtemelen en iyisi büyük bir konuşma konuşmacısı tarafından yapılabilir JJ, JJR, JJS burada https://gate.ac.uk/sale/tao/splitap7.html#x39-802000G. Gerçekten çok önerilen bir öneri olarak, kelime toplamalarına bakabilirsiniz: https://code.google.com/p/word2vec/ Yakın kelimeler eş anlamlı değildir ancak belki de modelin ayarlanması ve doğru veriler üzerinde eğitim eş anlamlılar oluşturabilir . Veya eş anlamlılar ve kelime kümeleri arasındaki kesişme olsun. – Yasen

cevap

4

Ne kökü ayırıcı veya lemmatizer greatest dan alabilirsiniz ->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' 

Ama greatest -> great almak PennTreeBank Tagset bazı güzel özellikleri yararlanabilirler gibi görünüyor:

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

>>> 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' 
:

en greatest başlayalım, en çılgın kural tabanlı sistem deneyelim

Kendi küçük üstünlüklü kökleştiricimizi/lemmatizer/tail_substituter'ımızı oluşturabileceğimizi biliyoruz, bir kelime üstün bir POS etiketi veriyorsa ve tail_substituter bizim açtığımız zaman JJ'yi ve dönüştüğümüzde JJR'yi bize verirse bir kural yazalım. güvenle kelimenin karşılaştırmalı ve baz formu kolayca bizim tail_substituter ile kazanılmış edilebileceğini söyleyebiliriz:

>>> 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' 

Şimdi bu greatest -> greater -> great sizi alır. great -> best'dan, sıradan akrabaları ilişkili olsa da, sözcüksel olarak ilişkili olmadıklarından, bir tür gariplik söz konusudur.

Yani ben o great -> best

+0

Aslında NLTK kullanmıyorum, ancak Wordnet bir MySQL veritabanına dönüştürüldü. Ama ben buna bakacağım - bu makul bir çözüm gibi görünüyor. –

İlgili konular