在python nltk.word_tokenize中保持尾随标点符号

时间:2017-02-07 22:13:46

标签: python nlp nltk tokenize

有很多关于删除标点符号的内容,但我似乎找不到任何保留它的内容。

如果我这样做:

from nltk import word_tokenize
test_str = "Some Co Inc. Other Co L.P."
word_tokenize(test_str)
Out[1]: ['Some', 'Co', 'Inc.', 'Other', 'Co', 'L.P', '.']

最后一个“。”被推入自己的标记。但是,如果相反,最后还有另一个单词,最后一个“。”保留:

from nltk import word_tokenize
test_str = "Some Co Inc. Other Co L.P. Another Co"
word_tokenize(test_str)
Out[1]: ['Some', 'Co', 'Inc.', 'Other', 'Co', 'L.P.', 'Another', 'Co']

我希望这总是作为第二种情况执行。现在,我正在做着:

from nltk import word_tokenize
test_str = "Some Co Inc. Other Co L.P."
word_tokenize(test_str + " |||")

因为我对扔掉“|||”感到非常自信在任何给定的时间,但不知道我可能想要保留哪些可能被丢弃的标点符号。有没有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:3)

这是一个拼写的怪癖,如果一个句子以缩写词结尾,我们只写一个句号,而不是两个句号。 nltk的标记化器不会“删除”它,它会将其拆分,因为句子结构(“句子必须以句点或其他合适的标点符号结尾”)对于NLP工具比缩写的一致表示更重要。标记化器足够聪明,可以识别大多数缩写,因此它不会将L.P.句子中的句点分开。

使用|||的解决方案导致句子结构不一致,因为您现在没有句子最终标点符号。更好的解决方案是仅在缩写后添加缺失期。这是一种方法,丑陋但与tokenizer自己的缩写识别器一样可靠:

toks = nltk.word_tokenize(test_str + " .")
if len(toks) > 1 and len(toks[-2]) > 1 and toks[-2].endswith("."):
    pass # Keep the added period
else:
    toks = toks[:-1]

PS。您已接受的解决方案将完全更改标记化,将所有标点符号附加到相邻单词(以及其他不良效果,如引入空标记)。这很可能不是你想要的。

答案 1 :(得分:0)

您可以使用re吗?

import re

test_str = "Some Co Inc. Other Co L.P."

print re.split('\s', test_str)

这会根据间距拆分输入字符串,保留标点符号。