更改nltk单词标记的句子元素并将其写回。 NLTK可以创建一个句子吗?

时间:2016-03-24 12:50:17

标签: python nltk

想象一下:

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   预订!

  • NLTK是否有用于构建标记的句子的内容 形成? (我的搜索没有返回任何内容)
  • 您建议采用哪种方法来达到预期效果?

请注意,这不是简单的同义词替换,而是自定义替换不同的单词标记。

1 个答案:

答案 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!)'