想象一下:
text = word_tokenize("And now, for something completely different, I will read this Python Book!")
tagged = nltk.pos_tag(text)
我希望能够找到任何JJ元素并使用我自己编辑,而不是:
[('And', 'CC'), ('now', 'RB'), (',', ','), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('different', 'JJ'), (',', ','), ('I', 'PRP'), ('will', 'MD'), ('read', 'VB'), ('this', 'DT'), ('Python', 'NNP'), ('Book', 'NNP'), ('!', '.')]
我会:
[('And', 'CC'), ('now', 'RB'), (',', ','), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('distinctive', 'JJ'), (',', ','), ('I', 'PRP'), ('will', 'MD'), ('read', 'VB'), ('this', 'DT'), ('Python', 'NNP'), ('Book', 'NNP'), ('!', '.')]
因为您无法更改/更新元组,所以我设法用区别替换JJ 不同,方法是创建另一个已经更改过的值的元组。
不是我想从第二个元组列表中重新创建我的句子(这应该是单词标记句子的正确表示)
总之,从这个:
[('And', 'CC'), ('now', 'RB'), (',', ','), ('for', 'IN'), ('something', 'NN'), ('completely', 'RB'), ('distinctive', 'JJ'), (',', ','), ('I', 'PRP'), ('will', 'MD'), ('read', 'VB'), ('this', 'DT'), ('Python', 'NNP'), ('Book', 'NNP'), ('!', '.')]
我想得到这个:现在,对于一些完全独特的东西,我会阅读这本Python书!
如果我尝试加入该列表中的第一个元组元素,我的句子会有额外的空格给我这个:
现在,对于完全不同的东西,我将阅读这篇Python 预订!
请注意,这不是简单的同义词替换,而是自定义替换不同的单词标记。
答案 0 :(得分:1)
如果您的问题是将标点符号正确地附加到前一个单词,那么不,NLTK没有任何设施。至于从标记句子中提取单词,理解这一点很简单(正如你已经做过的那样):
words = [ w for w, t in tagged ]
要正确组合标点符号,请使用正则表达式形成字符串并对其进行后处理。有足够的不确定性,你无法保证你会重现原始的安排,但如果你只是想要一些看似真实的东西,那就没关系。
一般规则是标点符号附加到前一个标记,除了引号和开放的parens(和方括号,如果它们出现在您的文本中)。您还需要管理一些特殊的nltk标记化规则,如下所示:
>>> sent = "And now: \"I'll read the Python book...\" (oh no, I won't!)"
>>> nltk.word_tokenize(sent)
['And', 'now', ':', '``', 'I', "'ll", 'read', 'the', 'Python', 'book', '...', "''",
'(', 'oh', 'no', ',', 'I', 'wo', "n't", '!', ')']
注意nltk如何分割收缩("I", "'ll"
),n't
成为单独的标记,双引号字符将被定向引号替换。所以这是一个简单的清理工作,以帮助您入门:
>>> newsent = " ".join(tokens)
>>> newsent = re.sub(r" (n't|'\w+)\b", r"\1", newsent) # contractions
>>> newsent = re.sub(r"(\(|``) ", r"\1", newsent) # right-attaching punctuation
>>> newsent = re.sub(r" ([^\s\w(`])", r"\1", newsent) # other punctuation
>>> newsent = re.sub(r"``|''", '"', newsent) # restore double quotes
>>> newsent
'And now: "I\'ll read the Python book..." (oh no, I won\'t!)'