2011-08-11 48 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 
相關問題