我的数据集中有两个句子:
w1 =我是Pusheen的猫。我太可爱了。 #期后没有空格
w2 =我是Pusheen的猫。我很可爱。 #句号后的空格
当我使用NKTL tokenizer(word和sent)时,nltk无法区分cat.I。
这是单词标记化
>>> nltk.word_tokenize(w1, 'english')
['I', 'am', 'Pusheen', 'the', 'cat.I', 'am', 'so', 'cute']
>>> nltk.word_tokenize(w2, 'english')
['I', 'am', 'Pusheen', 'the', 'cat', '.', 'I', 'am', 'so', 'cute']
并发送了tokenize
>>> nltk.sent_tokenize(w1, 'english')
['I am Pusheen the cat.I am so cute']
>>> nltk.sent_tokenize(w2, 'english')
['I am Pusheen the cat.', 'I am so cute']
我想问一下如何解决这个问题?即:在我的数据集中将nlkt检测为w2,有时单词和标点符号会粘在一起。
更新: 尝试过斯坦福CoreNLP 3.7.0,他们也无法区分猫咪。我'作为' cat','。','我'
meow@meow-server:~/projects/stanfordcorenlp$ java edu.stanford.nlp.process.PTBTokenizer sample.txt
I
am
Pusheen
the
cat.I
am
so
cute
.
PTBTokenizer tokenized 9 tokens at 111.21 tokens per second.
答案 0 :(得分:5)
它是故意这样实现的 - 一个没有空格的时期后它通常不表示一个句子的结尾(想想短语中的句点,如"版本4.3& #34;,"即"," AM"等)。如果你有一个语料库,在完全停止后没有空格的句子的末尾是常见的,你必须用正则表达式或类似的方法预处理文本,然后再发送给NLTK。
一个好的经验法则可能是,通常小写字母后跟一个句点后跟一个大写字母通常表示句子的结尾。要在这种情况下在句点之后插入空格,可以使用正则表达式,例如
import re
w1 = re.sub(r'([a-z])\.([A-Z])', r'\1. \2', w1)