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

w1 = 我是Pusheen the cat。我太可爱了。 #句号后没有空格
w2 = 我是猫 Pusheen。我很可爱。 # 句号后有空格

当我使用 NKTL 标记器(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']

并发送标记化
>>> 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.I”区分为“cat”、“.”、“I”
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.

最佳答案

它是故意以这种方式实现的——后面没有空格的句号通常并不表示句子的结束(想想“version 4.3”、“ie”、“AM”等短语中的句号) .如果您有一个语料库,句末句号后没有空格的情况很常见,则您必须在将文本发送到 NLTK 之前使用正则表达式或类似表达式对文本进行预处理。

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

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

关于python - NLTK 分词器和斯坦福 corenlp 分词器不能在句点 (.),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44858741/

10-12 16:33
查看更多