NLTK标记器和斯坦福corenlp标记器不能区分句子中没有空格的2个句子(。)

时间:2017-07-01 08:04:18

标签: python nlp nltk stanford-nlp tokenize

我的数据集中有两个句子:

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.

1 个答案:

答案 0 :(得分:5)

它是故意这样实现的 - 一个没有空格的时期后它通常不表示一个句子的结尾(想想短语中的句点,如"版本4.3& #34;,"即"," AM"等)。如果你有一个语料库,在完全停止后没有空格的句子的末尾是常见的,你必须用正则表达式或类似的方法预处理文本,然后再发送给NLTK。

一个好的经验法则可能是,通常小写字母后跟一个句点后跟一个大写字母通常表示句子的结尾。要在这种情况下在句点之后插入空格,可以使用正则表达式,例如

import re
w1 = re.sub(r'([a-z])\.([A-Z])', r'\1. \2', w1)
相关问题