nltk word_tokenize保持了开头的单引号,并且没有用空格填充它,

vngu2lb8  于 5个月前  发布在  其他
关注(0)|答案(7)|浏览(85)

word_tokenize 保持开放的单引号,不用空格填充,这是为了确保附着词被分词为 'll ,如 've' 等。
原始的树库分词器具有相同的行为,但斯坦福核心NLP并不具备。看起来有些额外的正则表达式被添加进来,以确保如果没有附着词,开放的单引号会被空格填充。
应该有一个非捕获的正则表达式来捕获非附着词并填充空格。
详细信息请参考:https://stackoverflow.com/questions/49499770/nltk-word-tokenizer-treats-ending-single-quote-as-a-separate-word/49506436#49506436

pb3skfrl

pb3skfrl1#

如果我们在https://github.com/nltk/nltk/blob/develop/nltk/tokenize/init.py处对word_tokenize进行以下更改,它将实现与Stanford CoreNLP相似的行为:
[输出]:

>>> print(word_tokenize("The 'v', I've been fooled but I'll seek revenge."))
['The', "'", 'v', "'", ',', 'I', "'ve", 'been', 'fooled', 'but', 'I', "'ll", 'seek', 'revenge', '.']
>>> word_tokenize("'v' 're'")
["'", 'v', "'", "'re", "'"]

上述正则表达式技巧将涵盖以下的clitics:

're
've
'll
'd
't
's
'm

是否还有更多的clitics应该添加?

nvbavucw

nvbavucw2#

单引号出现在复数名词的宾格形式末尾,如"providers'",该如何处理?

kzipqqlq

kzipqqlq3#

"读者"需要被分词为"读者"和"'"吗?此外,到目前为止这个bug的状态是什么?如果上面提到的更改还没有被实施,我想提出这个问题。

ddhy6vgd

ddhy6vgd4#

这个问题出现在开头的引号和附着词修复上,可以很容易地解决,这将使word_tokenize的行为类似于斯坦福大学的。我个人认为这是一个很好的功能。
请随时贡献并在上面打开一个pull-request=)
但是要处理所有格复数,很难理解如何做到这一点,因为我们需要定义句子之间的差异,例如:

The providers' CEO went on a holiday.
He said, 'The CEO has fired the providers'.
Breaking news: 'Down to all providers'
The 'internet providers' have went on a holiday.

有很多示例表明,所有格复数可能会与关闭的单引号混淆。我认为对于使用单引号表示复数所有格的情况,不值得修复。

vfh0ocws

vfh0ocws5#

import nltk
import codecs
file = codecs.open('new2.txt', 'r', 'utf8')
fh = file.readlines()  # ['సతతహరిత', 'సమశీతోష్ణ', ' అడవి-ఇల్లు*అడవి '] - the line is stored in new1.txt

# the king's cat is caught with kit's. -the line is stored in new2.txt

for line in fh:
    l = nltk.tokenize.word_tokenize(line)
print(l)  # ['[', "'సతతహరిత", "'", ',', "'సమశీతోష్ణ", "'", ',', "'", 'అడవి-ఇల్లు', '*', 'అడవి', "'", ']']

# ['\ufeffthe', 'king', "'s", 'cat', 'is', 'caught', 'with', 'kit', "'s", '.']

ll = []  # to store new updated token list
for i in l:
    if i[0] == ''':
        ix = i.replace('', '')
        ll.append(ix)
    else:
        ll.append(i)

# updated correct one's

print(ll)  # ['[', 'సతతహరిత', '', ',', 'సమశీతోష్ణ', '', ',', '', 'అడవి-ఇల్లు', '*', 'అ√∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∫∴']
dgtucam1

dgtucam16#

我刚刚又处理了nltk分词器的结果,它解决了我的问题。

但这可能不是最优解决方案,需要更新nltk库

6l7fqoea

6l7fqoea7#

是否存在从#2018的回归问题,还是说这个pr没有解决这个问题?
nltk版本:3.8.1
python版本:3.10.12

from nltk.tokenize import word_tokenize

sentence = "I've said many times, 'We'll make it through!'"
word_tokenize(sentence)

预期结果:['I', "'ve", 'said', 'many', 'times', ',', "'", "We", "'ll", 'make', 'it', 'through', '!', "'"]
实际结果:['I', "'ve", 'said', 'many', 'times', ',', "'We", "'ll", 'make', 'it', 'through', '!', "'"]

相关问题