Python 有没有一个图书馆可以把句子分成一系列单词?

Python 有没有一个图书馆可以把句子分成一系列单词?,python,regex,nlp,Python,Regex,Nlp,我正在研究用于python的nltk,但它拆分(标记化)不会为['wo',“n't”]。有没有更有力地做到这一点的图书馆 我知道我可以构建某种类型的正则表达式来解决这个问题,但我正在寻找一个库/工具,因为这将是一种更直接的方法。例如,在一个带有句号和逗号的基本正则表达式之后,我意识到像“先生”这样的词会破坏系统 (@artsiom) 如果句子是“你不会?”,split()会给我[“你”,“不会?”]。所以有一个额外的“?”我必须处理。 我正在寻找一种经过尝试和测试的方法,它可以消除像上面提到的纠

我正在研究用于python的nltk,但它拆分(标记化)
不会
['wo',“n't”]
。有没有更有力地做到这一点的图书馆

我知道我可以构建某种类型的正则表达式来解决这个问题,但我正在寻找一个库/工具,因为这将是一种更直接的方法。例如,在一个带有句号和逗号的基本正则表达式之后,我意识到像“先生”这样的词会破坏系统

(@artsiom)

如果句子是“你不会?”,split()会给我[“你”,“不会?”]。所以有一个额外的“?”我必须处理。
我正在寻找一种经过尝试和测试的方法,它可以消除像上面提到的纠结以及我确信存在的许多例外。当然,如果找不到,我会使用split(regex)。

@karthigh,这里有一个简单的算法,我很久以前就用过它将文本拆分成单词列表:

  • 输入文本
  • 逐字遍历文本
  • 如果当前字符为“字母表”,则将其附加到单词中。Else-将先前创建的单词添加到列表中,然后开始一个新单词
    它只是一个启动板,您可以修改此算法使其更智能:)

    (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还不够聪明,但例如在
    的情况下,它也没那么糟糕:)。@Jefromi
    ntlk.word\u tokenize
    是一个单词标记器,它使用用户使用的约定标记句子。根据这种标记化,动词缩略语和名词的盎格鲁-撒克逊属格被分成它们的组成语素,每个语素都被分别标记(
    不会
    -->
    不会
    他会
    ->
    他会
    )。我想我必须这样做(使用regex和split)。=)