NLTK 将标记化的句子转换为同义词集格式

Posted

技术标签:

【中文标题】NLTK 将标记化的句子转换为同义词集格式【英文标题】:NLTK convert tokenized sentence to synset format 【发布时间】:2015-02-19 21:34:35 【问题描述】:

我希望使用 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'...)与同义词集作为参数的格式不匹配。

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

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

这样的格式

【问题讨论】:

【参考方案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 标记集(我相信这是 pos_tag 使用的默认标记集)使用“N”后面跟着一些东西来识别synset 将看到的wordnet.NOUN 的变体。

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

【讨论】:

【参考方案2】:

你可以使用一个简单的转换函数:

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

【讨论】:

我找到了这个lesk 示例,但是您的代码似乎给出了更好的结果,我想知道为什么会这样(只是好奇):nltk.org/howto/wsd.html Lesk 并没有那么好用。这段代码可能运行得更好的唯一原因是它获得了第一个同义词集。在 wordnet 中,同义词集是按频率排序的。换句话说,如果我们不考虑上下文,第一个同义词集是最有可能的。

以上是关于NLTK 将标记化的句子转换为同义词集格式的主要内容,如果未能解决你的问题,请参考以下文章

NLTK wordnet 接口中的第 0 个同义词集

text 将WoneF数据库文件转换为Solr格式的同义词文件

有中文的同义句子转换器麼?有人知道麼?就是意思不变换个说法的那种。

文本分类的数据增强

从NLTK for Python中的同义词列表中提取单词

Python NLP入门教程