我正在寻找nltk for python,但它将(tokenize)拆分won't为['wo',"n't"].有没有更强大的图书馆?
我知道我可以构建某种类型的正则表达式来解决这个问题,但我正在寻找一个库/工具,因为它将是一种更直接的方法.例如,在带有句号和逗号的基本正则表达式之后,我意识到像'先生这样的词 '将破坏系统.
(@artsiom)
如果句子是"你不会?",split()会给我["你","不会?"].所以有一个额外的'?' 我必须处理.我正在寻找一种经过试验和测试的方法,它可以消除上面提到的扭结,以及我确信存在的很多例外情况.当然,如果我找不到,我将采用拆分(正则表达式).
自然语言工具包(NLTK)可能就是您所需要的.
>>> from nltk.tokenize import word_tokenize
>>> word_tokenize("'Hello. This is a test. It works!")
["'Hello", '.', 'This', 'is', 'a', 'test', '.', 'It', 'works', '!']
>>> word_tokenize("I won't fix your computer")
['I', 'wo', "n't", 'fix', 'your', 'computer']
Run Code Online (Sandbox Code Playgroud)
nltk.tokenize.word_tokenize默认情况下使用TreebankWordTokenizer一个单词标记器,它使用Penn Treebank约定来标记句子.
请注意,此标记生成器假定文本已被分段为句子.
您可以测试一些通过NLTK提供的各种断词(即WordPunctTokenizer,WhitespaceTokenizer这对...)页.
尽管你说的是,但NLTK是你最好的选择.在那里你不会找到比断词更"久经考验"的方法(因为有的基于此特别训练的calssifiers).您只需要根据需要选择正确的标记器.我们来看下面这句话:
I am a happy teapot that won't do stuff?
Run Code Online (Sandbox Code Playgroud)
以下是NLTK中的各种标记器如何将其拆分.
TreebankWordTokenizer
I am a happy teapot that wo n't do stuff ?
Run Code Online (Sandbox Code Playgroud)
WordPunctTokenizer
I am a happy teapot that won ' t do stuff ?
Run Code Online (Sandbox Code Playgroud)
PunktWordTokenizer
I am a happy teapot that won 't do stuff ?
Run Code Online (Sandbox Code Playgroud)
WhitespaceTokenizer
I am a happy teapot that won't do stuff?
Run Code Online (Sandbox Code Playgroud)
您最好的选择可能是各种方法.例如,你可以使用PunktSentenceTokenizer来首先标记你的句子,这往往是极端准确的.然后对于每个句子删除最后的标点符号(如果有的话).然后使用WhitespaceTokenizer,这样你就可以避免最后的标点/单词组合,例如stuff?,因为你将从每个句子中删除最后的标点符号,但你仍然知道句子在哪里分隔(例如将它们存储在一个数组中)和你不会won't以意想不到的方式分手.