NLTK将标记化句子转换为synset格式

时间:2014-12-21 16:58:07

标签: python nltk sentiment-analysis

我希望使用NLTK获得单个单词和句子中每个单词之间的相似性。

NLTK可以获得两个特定单词之间的相似性,如下所示。这个方法要求给出对该单词的特定引用,在这种情况下它是'dog.n.01',其中dog是名词,我们想要使用第一个(01)NLTK定义。

dog = wordnet.synset('dog.n.01')
cat = wordnet.synset('cat.n.01')
print  dog.path_similarity(cat)
>> 0.2

问题是我需要从句子中的每个单词中获取词性信息。 NLTK包能够获得句子中每个单词的词性,如下所示。但是,这些语音部分('NN','VB','PRP'...)与synset用作参数的格式不匹配。

text = word_tokenize("They refuse to permit us to obtain the refuse permit")
pos_tag(text)
>> [('They', 'PRP'), ('refuse', 'VBP'), ('to', 'TO'), ('permit', 'VB'), ('us', 'PRP'), ('to', 'TO'), ('obtain', 'VB'), ('the', 'DT'), ('refuse', 'NN'), ('permit', 'NN')]

是否可以从pos_tag()获取synset格式的数据导致NLTK?通过synset格式化我的意思是像dog.n.01

这样的格式

2 个答案:

答案 0 :(得分:9)

您可以使用简单的转换功能:

from nltk.corpus import wordnet as wn

def penn_to_wn(tag):
    if tag.startswith('J'):
        return wn.ADJ
    elif tag.startswith('N'):
        return wn.NOUN
    elif tag.startswith('R'):
        return wn.ADV
    elif tag.startswith('V'):
        return wn.VERB
    return None

在标记句子后,您可以使用此功能将句子中的单词与SYNSET绑定。这是一个例子:

from nltk.stem import WordNetLemmatizer
from nltk import pos_tag, word_tokenize

sentence = "I am going to buy some gifts"
tagged = pos_tag(word_tokenize(sentence))

synsets = []
lemmatzr = WordNetLemmatizer()

for token in tagged:
    wn_tag = penn_to_wn(token[1])
    if not wn_tag:
        continue

    lemma = lemmatzr.lemmatize(token[0], pos=wn_tag)
    synsets.append(wn.synsets(lemma, pos=wn_tag)[0])

print synsets

结果: [Synset(' be.v.01'),Synset(' travel.v.01'),Synset(' buy.v .01'),Synset(' gift.n.01')]

答案 1 :(得分:1)

您可以使用wordnet.synset的替代形式:

wordnet.synset('dog', pos=wordnet.NOUN)

你仍然需要将pos_tag提供的标签翻译成wordnet.sysnset支持的标签 - 遗憾的是,我不知道预制字典是这样做的,所以(除非我我错过了这种对应表的存在)你需要建立自己的(你可以做一次并腌制它以便随后重新加载)。

请参阅http://www.nltk.org/book/ch05.html,第1章,了解如何获取有关特定标记集的帮助 - 例如nltk.help.upenn_tagset('N.*')将确认UPenn标记集(我认为是{{1}使用的默认标记集})使用'N'后跟某些内容来识别pos_tag将看作synset的变体。

我没有尝试过http://www.nltk.org/_modules/nltk/tag/mapping.html,但可能正是您所需要的 - 试一试!