2013-03-21 12 views
70

私はちょうどNLTKを使い始めており、テキストから単語のリストを取得する方法はあまりよく分かりません。 nltk.word_tokenize()を使用すると、単語と句読点のリストが表示されます。代わりに言葉だけが必要です。どのようにして句読点を取り除くことができますか?また、word_tokenizeは複数の文章では機能しません。最後の単語にドットが追加されます。NLTK tokenizerを使用して句読点を取り除くにはどうすればよいですか?

+10

は、なぜあなたは句読点自分自身を削除していませんか? 'nltk.word_tokenize(the_text.translate(None、string.punctuation))'はpython2で動作するはずですが、python3では 'nltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation))')を実行できます。 – Bakuriu

+2

これは動作しません。テキストは何も起こりません。 – lizarisk

+0

NLTKが想定しているワークフローは、まず文にトークン化し、すべての文を単語にトークン化することです。そのため、 'word_tokenize()'は複数の文では動作しません。句読点を取り除くには、正規表現やPythonの 'isalnum()'関数を使うことができます。 –

答えて

13

コメントで気付いたのは、sent_tokenize()で始まります。なぜなら、word_tokenize()は単一の文でのみ機能するからです。 filter()で句読点を除外することができます。また、Unicode文字列を持っている場合は、Unicodeオブジェクトであることを確認してください( 'utf-8'のようなエンコーディングでエンコードされた 'str'ではありません)。

from nltk.tokenize import word_tokenize, sent_tokenize 

text = '''It is a blue, small, and extraordinary ball. Like no other''' 
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)] 
print filter(lambda word: word not in ',-', tokens) 
+12

Penn Treebankトークナイザに含まれる複雑さのほとんどは、句読点の適切な処理に関係しています。句読点を取り除くだけの場合は、句読点を扱う高価なトークナイザを使用するのはなぜですか? – rmalouf

+2

'word_tokenize'は、' [_treebank_word_tokenize(sent)]にトークンのためにsent_tokenize(text、language)で送られたトークン 'を返す関数です。 あなたの答えはすでにnltkがしていることをしていると思います: 'word_tokenize()'を使う前に 'sent_tokenize()'を使ってください。 少なくともこれはnltk3用です。 –

+2

@rmaloufあなたは句読点だけのトークンを必要としないので?したがって、 'did'と' n't'ではなく '.'を指定します。 –

107

nltkが提供する他のトークン化オプションについては、hereを参照してください。たとえば、トークンとして英数字のシーケンスを選ぶと他のすべてをドロップトークナイザを定義することができます。

from nltk.tokenize import RegexpTokenizer 

tokenizer = RegexpTokenizer(r'\w+') 
tokenizer.tokenize('Eighty-seven miles to go, yet. Onward!') 

出力:私は、次のコードを使用

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward'] 
+28

このオプションを使用すると、収縮を分割するような' word_tokenize'に特有の自然言語機能が失われることに注意してください。 NLTKを必要とせずに、正規表現 '\ w +'を素直に分割することができます。 – sffc

8

、すべての句読点を削除:

tokens = nltk.wordpunct_tokenize(raw) 

type(tokens) 

text = nltk.Text(tokens) 

type(text) 

words = [w.lower() for w in text if w.isalpha()] 
+1

なぜトークンをテキストに変換するのですか? – Sadik

4

私は句読点を削除するには、このコードを使用します。

import nltk 
def getTerms(sentences): 
    tokens = nltk.word_tokenize(sentences) 
    words = [w.lower() for w in tokens if w.isalnum()] 
    print tokens 
    print words 

getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ") 

そして、あなたはトークンが有効な英語の単語であるかどうかを確認したい場合は、PyEnchant

チュートリアル必要があるかもしれません:あなたは本当に句読点を削除するNLTKを必要としない

import enchant 
d = enchant.Dict("en_US") 
d.check("Hello") 
d.check("Helo") 
d.suggest("Helo") 
+0

この解決策は収縮を殺すことに注意してください。これは、 'word_tokenize'が標準的なトークナイザである' TreebankWordTokenizer'を使用して、収縮を分割しているからです(例えば 'can't'を(' ca'、 'n't')に変換しますが、' n't'は英数字ではなく、 –

25

を。シンプルなPythonでそれを削除することができます。

import string 
s = '... some string with punctuation ...' 
s = s.translate(None, string.punctuation) 

またはUnicode用:

import string 
translate_table = dict((ord(char), None) for char in string.punctuation) 
s.translate(translate_table) 

、その後、あなたのトークナイザで、この文字列を使用した文字列の場合。

P.S.文字列モジュールには、(数字のような)削除可能な要素がいくつかあります。

5

私はあなたが(次のコードは、Python 3である)に一致する正規表現のいくつかの並べ替えが必要だと思う:

import string 
import re 
import nltk 

s = "I can't do this now, because I'm so tired. Please give me some time." 
l = nltk.word_tokenize(s) 
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)] 
print(l) 
print(ll) 

出力:それは句読点を削除するので

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.'] 
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time'] 

は、ほとんどの場合うまく動作するはずwordpunct_tokenizeのような正規表現のトークナイザからは得られない "not"のようなトークンを保存します。

7

以下のコードでは、すべての句読記号とアルファベット以外の文字が削除されます。彼らの本からコピーされました。

http://www.nltk.org/book/ch01.html

import nltk 

s = "I can't do this now, because I'm so tired. Please give me some time. @ sd 4 232" 

words = nltk.word_tokenize(s) 

words=[word.lower() for word in words if word.isalpha()] 

print(words) 

出力

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd'] 
+3

この方法を使うと、 "できない"や "しない"のような文では、文を理解して分類する上で非常に重要な場合があります。 sentence.translate(string.maketrans( ""、 ""、)、chars_to_remove)を使用して、chars_to_removeは "。、 ': – MikeL

関連する問題