2011-08-11 46 views
5

我正在寻找Python的nltk,但它拆分(标记)won't['wo',"n't"]。有没有更强大的库?是否有将句子拆分为单词列表的库?

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

(@artsiom)

如果一句 “你会不会?”,分裂()会给我[ “你”, “不会?”。所以还有一个'?'我必须处理。 我正在寻找一种久经考验的方法,它可以消除像上面提到的那样的扭结问题,还有很多我肯定存在的例外情况。当然,如果我找不到任何东西,我会采取分裂(正则表达式)。

+3

很抱歉,如果我错过somenthing但为什么不text.split()? –

+1

你期望什么结果? – Simon

回答

3

@Karthick,这里是一个简单的算法我以前早就分割文本到单词表:

  1. 输入文本
  2. 迭代通过字符的文本字符。
  3. 如果当前字符在“字母表”中,则将其附加到单词中。否则 - 将以前创建的单词添加到列表中并开始一个新单词。

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'] 

这只是一个启动的,你绝对可以修改这个算法,使之更聪明:)

+0

我想我有这一点(使用正则表达式和分裂)做。 =) – Karthick

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约定句子的词。

请注意,此标记器假定文本已被分割为 句子。

您可以在此page上测试由NLTK提供的一些各种标记器(即WordPunctTokenizer,WhitespaceTokenizer ...)。

+3

什么是一个分裂的理由“不会”到“where”和“紧急”? – Cascabel

+0

因为它实际上是两个单词,不会=不会。当然,这是没有足够的智慧,以取代在那里,并希望,但例如在的情况下'don't'它不是那么糟糕:)。 – skorks

+0

@Jefromi'ntlk.word_tokenize'就是一个字标记生成器确实使用由[宾州树库]中使用的约定句子标记化(http://www.cis.upenn.edu/~treebank/tokenization.html)。 。根据这个标记化,动词收缩和名词的盎格鲁撒克逊所有格拆分为它们的COMPO新界东北词素,并且每个词素被单独标记('won't' - >'其中n't','he'll' - 他会')。 –

1

NLTK附带了许多不同的标记器,您可以在text-processing.com word tokenization demo的每个联机中看到演示。对于你的情况,它看起来像WhitespaceTokenizer是最好的,这与string.split()基本相同。

5

不管你说什么,NLTK是你最好的选择。你不会找到比那里的标记器更“经过测试”的方法(因为有些是基于专门为此而训练的测距器的)。你只需要为你的需要选择正确的标记。我们来看下面这句话:

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? 

你最好的选择可能是方法的组合。例如,您可以使用PointSentenceTokenizer首先勾选您的句子,这往往是非常准确的。然后为每个句子删除标点符号,如果有的话。然后使用WhitespaceTokenizer,这样您就可以避免最后的标点符号/词组合,例如stuff?,因为你已删除从每个句子最后的标点字符,但你还是知道的句子被分隔(例如,将其存储在一个数组),你不会有字检查won't以意想不到的方式破碎。

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 
相关问题