Python 有没有一个图书馆可以把句子分成一系列单词?
我正在研究用于python的nltk,但它拆分(标记化)Python 有没有一个图书馆可以把句子分成一系列单词?,python,regex,nlp,Python,Regex,Nlp,我正在研究用于python的nltk,但它拆分(标记化)不会为['wo',“n't”]。有没有更有力地做到这一点的图书馆 我知道我可以构建某种类型的正则表达式来解决这个问题,但我正在寻找一个库/工具,因为这将是一种更直接的方法。例如,在一个带有句号和逗号的基本正则表达式之后,我意识到像“先生”这样的词会破坏系统 (@artsiom) 如果句子是“你不会?”,split()会给我[“你”,“不会?”]。所以有一个额外的“?”我必须处理。 我正在寻找一种经过尝试和测试的方法,它可以消除像上面提到的纠
不会
为['wo',“n't”]
。有没有更有力地做到这一点的图书馆
我知道我可以构建某种类型的正则表达式来解决这个问题,但我正在寻找一个库/工具,因为这将是一种更直接的方法。例如,在一个带有句号和逗号的基本正则表达式之后,我意识到像“先生”这样的词会破坏系统
(@artsiom)
如果句子是“你不会?”,split()会给我[“你”,“不会?”]。所以有一个额外的“?”我必须处理。
我正在寻找一种经过尝试和测试的方法,它可以消除像上面提到的纠结以及我确信存在的许多例外。当然,如果找不到,我会使用split(regex)。@karthigh,这里有一个简单的算法,我很久以前就用过它将文本拆分成单词列表:
它只是一个启动板,您可以修改此算法使其更智能:)(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提供的一些不同的标记器(即…)。NLTK附带了许多不同的标记器,您可以在网站上看到每个标记器的演示。对于您的情况,看起来
白空间标记器是最好的,这与执行string.split()
基本相同,不管您怎么说,到目前为止,NLTK是您最好的选择。您将找不到比其中的标记化器更“久经考验”的方法(因为有些方法是基于专门为此培训的Calssifier)。您只需要根据需要选择合适的标记器。让我们看下面这句话:
I am a happy teapot that won't do stuff?
下面是NLTK中的各种标记器如何将其拆分
TreebankWordTokenizer
I am a happy teapot that wo n't do stuff ?
I am a happy teapot that won ' t do stuff ?
I am a happy teapot that won 't do stuff ?
I am a happy teapot that won't do stuff?
WordPunctTokenizer
I am a happy teapot that wo n't do stuff ?
I am a happy teapot that won ' t do stuff ?
I am a happy teapot that won 't do stuff ?
I am a happy teapot that won't do stuff?
PunktWordTokenizer
I am a happy teapot that wo n't do stuff ?
I am a happy teapot that won ' t do stuff ?
I am a happy teapot that won 't do stuff ?
I am a happy teapot that won't do stuff?
空白标记符
I am a happy teapot that wo n't do stuff ?
I am a happy teapot that won ' t do stuff ?
I am a happy teapot that won 't do stuff ?
I am a happy teapot that won't do stuff?
您的最佳选择可能是多种方法的组合。例如,您可以首先使用PunktSentenceTokenizer标记您的句子,这往往是非常准确的。然后删除每个句子末尾的标点符号(如有)。然后使用WhitespaceTokenizer,这样可以避免最后的标点符号/单词组合,例如stuff?
,因为您将从每个句子中删除最后的标点符号字符,但您仍然知道句子的分隔位置(例如,将它们存储在数组中)而且,您不会遇到像“不会”这样的单词以意外方式分解。您可以尝试以下方法:
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
op=[]
string\u big=“Python最酷的功能之一是字符串格式运算符,该运算符是字符串所特有的”
标志=无
position\u start=0
当position\u start
对不起,如果我遗漏了什么,为什么不使用text.split()?将“不会”分为“不会”和“不会”的理由是什么?因为它实际上是两个词,woll not=will not。当然,用遗嘱代替wo还不够聪明,但例如在不
的情况下,它也没那么糟糕:)。@Jefromintlk.word\u tokenize
是一个单词标记器,它使用用户使用的约定标记句子。根据这种标记化,动词缩略语和名词的盎格鲁-撒克逊属格被分成它们的组成语素,每个语素都被分别标记(不会
-->不会
,他会
->他会
)。我想我必须这样做(使用regex和split)。=)