是否有用于将句子分成单词列表的库?

时间:2011-08-11 13:22:49

标签: python regex nlp

我正在查看nltk for python,但它将{tokenize} won't拆分为['wo',"n't"]。有没有更强大的图书馆?

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

(@ artsiom)

如果句子是“你不会?”,split()会给我[“你”,“不会?”]。所以有一个额外的'?'我必须处理。 我正在寻找一种经过试验和测试的方法,它可以消除上面提到的扭结,以及我确信存在的很多例外情况。当然,如果我找不到,我将采用拆分(正则表达式)。

5 个答案:

答案 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提供的一些各种令牌化程序(例如WhitespaceTokenizerpage ...)。

答案 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,这是我很久以前用来将文本拆分成单词表的简单算法:

  1. 输入文字
  2. 逐字逐句地逐字逐句。
  3. 如果当前字符位于“alphabet”中,则将其附加到单词。否则 - 将先前创建的单词添加到列表中并开始一个新单词。

  4. 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