Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python NLTK将标记化句子转换为synset格式_Python_Nltk_Sentiment Analysis - Fatal编程技术网

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

Python NLTK将标记化句子转换为synset格式,python,nltk,sentiment-analysis,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获得单个单词和句子中每个单词之间的相似性

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

是否可以从NLTK中的pos_tag()结果中获取synset格式的数据?synset formatted是指类似于
dog.n.01

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

wordnet.synset('dog', pos=wordnet.NOUN)
您仍然需要将
pos_-tag
提供的标记转换为
wordnet.sysnset
支持的标记——不幸的是,我不知道有预构建的字典会这样做,因此(除非我缺少这样一个对应表),您需要构建自己的(您可以这样做一次,然后对其进行酸洗以备后续重新加载)

参见第1分章,关于如何获取特定标记集的帮助——例如
nltk.help.upenn_标记集('N.*)
)将确认upenn标记集(我认为是
pos_标记所使用的默认标记集)使用'N'后跟一些东西来识别
synset
将视为
wordnet.NOUN
的变体


我没有试过,但它可能正是您所需要的--试试看!

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

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
在为一个句子添加标签后,您可以使用此函数将句子中的一个单词与一个语法集联系起来。下面是一个示例:

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')]/p>我发现了这个
lesk
示例,但您的代码似乎给出了更好的结果,我想知道这是为什么(只是好奇):Lesk的工作并不那么好。这段代码工作得更好的唯一原因是它得到了第一个语法集。在wordnet中,语法集是按频率排序的。换句话说,如果我们不考虑上下文,第一个语法集是最有可能的。