我正在查看nltk for python,但它将{tokenize} won't
拆分为['wo',"n't"]
。有没有更强大的图书馆?
我知道我可以构建某种类型的正则表达式来解决这个问题,但我正在寻找一个库/工具,因为它将是一种更直接的方法。例如,在带有句号和逗号的基本正则表达式之后,我意识到像'先生这样的词'将破坏系统。
(@ artsiom)
如果句子是“你不会?”,split()会给我[“你”,“不会?”]。所以有一个额外的'?'我必须处理。 我正在寻找一种经过试验和测试的方法,它可以消除上面提到的扭结,以及我确信存在的很多例外情况。当然,如果我找不到,我将采用拆分(正则表达式)。
答案 0 :(得分:9)
The Natural Language Toolkit(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']
默认情况下, nltk.tokenize.word_tokenize
使用TreebankWordTokenizer
,这是一个使用Penn Treebank约定来标记句子的单词标记器。
请注意,此标记生成器假定文本已被分段 句子。
您可以在此WordPunctTokenizer
上测试NLTK提供的一些各种令牌化程序(例如WhitespaceTokenizer
,page ...)。
答案 1 :(得分:5)
尽管你说的是,NLTK是你最好的选择。你不会找到比那里的标记器更“尝试和测试”的方法(因为有些是基于专门为此训练的calssifiers)。您只需要根据需要选择正确的标记器。我们来看下面这句话:
I am a happy teapot that won't do stuff?
以下是NLTK中的各种标记器如何将其拆分。
<强> TreebankWordTokenizer 强>
I am a happy teapot that wo n't do stuff ?
<强> WordPunctTokenizer 强>
I am a happy teapot that won ' t do stuff ?
<强> PunktWordTokenizer 强>
I am a happy teapot that won 't do stuff ?
<强> WhitespaceTokenizer 强>
I am a happy teapot that won't do stuff?
您最好的选择可能是各种方法。例如,你可以使用PunktSentenceTokenizer来首先标记你的句子,这往往是极端准确的。然后对于每个句子删除最后的标点符号(如果有的话)。然后使用WhitespaceTokenizer,这样你就可以避免最后的标点符号/单词组合,例如stuff?
,因为你将从每个句子中删除最后的标点字符,但你仍然知道句子在哪里分隔(例如将它们存储在一个数组中),你就不会有像won't
这样的单词以意想不到的方式分手。
答案 2 :(得分:3)
@Karthick,这是我很久以前用来将文本拆分成单词表的简单算法:
alphabet = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
text = "I won't answer this question!"
word = ''
wordlist = []
for c in text:
if c in alphabet:
word += c
else:
if len(word) > 0:
wordlist.append(word)
word = ''
print wordlist
['I', "won't", 'answer', 'this', 'question']
它只是一个启动板,您绝对可以修改此算法以使其更智能:)
答案 3 :(得分:1)
NLTK附带了许多不同的标记器,您可以在text-processing.com word tokenization demo看到每个在线演示。对于您的情况,看起来WhitespaceTokenizer
最好,这与执行string.split()
基本相同。
答案 4 :(得分:0)
你可以试试这个:
op = []
string_big = "One of Python's coolest features is the string format operator This operator is unique to strings"
Flag = None
postion_start = 0
while postion_start < len(string_big):
Flag = (' ' in string_big)
if Flag == True:
space_found = string_big.index(' ')
print(string_big[postion_start:space_found])
#print(space_found)
op.append(string_big[postion_start:space_found])
#postion_start = space_found
string_big = string_big[space_found+1:len(string_big)]
#print string_big
else:
op.append(string_big[postion_start:])
break
print op