有很多关于删除标点符号的内容,但我似乎找不到任何保留它的内容。
如果我这样做:
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 + " |||")
因为我对扔掉“|||”感到非常自信在任何给定的时间,但不知道我可能想要保留哪些可能被丢弃的标点符号。有没有更好的方法来实现这一目标?
答案 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)
这会根据间距拆分输入字符串,保留标点符号。