2016-02-17 6 views
2

Я читаю список предложений и помещает каждое слово с помощью тестера TST Stanford POS. Я получаю выходы так:Python: map NLTK Стэнфордские теги POS для тегов POS для WordNet

wordnet_sense = [] 

for o in output: 
    a = st.tag(o) 
    wordnet_sense.append(a) 

выходы: [[(u'feel', u'VB'), (u'great', u'JJ')], [(u'good', u'JJ')]]

Я хочу, чтобы сопоставить эти слова с их POS, так что они признаются в WordNet.

Я попытался это:

sense = [] 

for i in wordnet_sense: 
    tmp = [] 

    for tok, pos in i: 
     lower_pos = pos[0].lower() 

     if lower_pos in ['a', 'n', 'v', 'r', 's']: 
      res = wn.synsets(tok, lower_pos) 
      if len(res) > 0: 
       a = res[0] 
     else: 
      a = "[{0}, {1}]".format(tok, pos) 

     tmp.append(a) 

    sense.append(tmp) 

print sense 

выходы: [Synset('feel.v.01'), '[great, JJ]'], ['[good, JJ]']]

Так feel признается в качестве глагола, но и greatgood не распознаются как прилагательные. Я также проверил, действительно ли great и good принадлежат к Wordnet, потому что я думал, что они не были сопоставлены, если их там не было, но они есть. Может ли кто-нибудь помочь?

ответ

2

Вот мило функция от pywsd:

from nltk.corpus import wordnet as wn 

def penn2morphy(penntag, returnNone=False): 
    morphy_tag = {'NN':wn.NOUN, 'JJ':wn.ADJ, 
        'VB':wn.VERB, 'RB':wn.ADV} 
    try: 
     return morphy_tag[penntag[:2]] 
    except: 
     return None if returnNone else '' 
+0

См. Также: https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html – alvas

1
def wordnet_pos_code(tag): 
    if tag.startswith('NN'): 
     return wn.NOUN 
    elif tag.startswith('VB'): 
     return wn.VERB 
    elif tag.startswith('JJ'): 
     return wn.ADJ 
    elif tag.startswith('RB'): 
     return wn.ADV 
    else: 
     return '' 



print wordnet_pos_code('NN')` 

Как и ответ при условии, что я нашел это, что тоже работает.