web-dev-qa-db-ja.com

NLTKトークナイザーを使用して句読点を取り除く方法は?

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

104
lizarisk

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

句読点を削除するのにNLTKは本当に必要ありません。簡単なpythonで削除できます。文字列の場合:

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

またはユニコードの場合:

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

次に、この文字列をトークナイザーで使用します。

P.S。文字列モジュールには、削除可能な他の要素セット(数字など)があります。

41
Salvador Dali

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

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']
20
Madura Pradeep

コメントでわかるように、send_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)
15
palooh

次のコードを使用しただけで、すべての句読点が削除されました。

tokens = nltk.wordpunct_tokenize(raw)

type(tokens)

text = nltk.Text(tokens)

type(text)  

words = [w.lower() for w in text if w.isalpha()]
9
vish

何らかの正規表現の一致が必要だと思います(次のコードは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などの正規表現トークナイザーから取得できない「n't」などのトークンを保持しながら、句読点を削除するため、ほとんどの場合にうまく機能するはずです。

6
Quan Gan

このコードを使用して、句読点を削除します。

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

チュートリアル:

 import enchant
 d = enchant.Dict("en_US")
 d.check("Hello")
 d.check("Helo")
 d.suggest("Helo")
4
zhenv5

句読点を削除します(以下のコードを使用して、句読点の処理の一部と同様に削除します)

        tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P'))
        text_string = text_string.translate(tbl) #text_string don't have punctuation
        w = Word_tokenize(text_string)  #now tokenize the string 

サンプル入出力:

direct flat in oberoi esquire. 3 bhk 2195 saleable 1330 carpet. rate of 14500 final plus 1% floor rise. tax approx 9% only. flat cost with parking 3.89 cr plus taxes plus possession charger. middle floor. north door. arey and oberoi woods facing. 53% paymemt due. 1% transfer charge with buyer. total cost around 4.20 cr approx plus possession charges. rahul soni

['direct', 'flat', 'oberoi', 'esquire', '3', 'bhk', '2195', 'saleable', '1330', 'carpet', 'rate', '14500', 'final', 'plus', '1', 'floor', 'rise', 'tax', 'approx', '9', 'flat', 'cost', 'parking', '389', 'cr', 'plus', 'taxes', 'plus', 'possession', 'charger', 'middle', 'floor', 'north', 'door', 'arey', 'oberoi', 'woods', 'facing', '53', 'paymemt', 'due', '1', 'transfer', 'charge', 'buyer', 'total', 'cost', 'around', '420', 'cr', 'approx', 'plus', 'possession', 'charges', 'rahul', 'soni']

1
ascii_walker

心からお願い、言葉は何ですか? Wordがアルファベット文字のみで構成されていると仮定した場合、can'tなどの単語は断片(cantなど)に破壊されるため、間違っていますifトークン化の前に句読点を削除します。これはプログラムに悪影響を与える可能性が非常に高いです。

したがって、解決策はトークンを作成してから句読点トークンを削除するです。

import string

from nltk.tokenize import Word_tokenize

tokens = Word_tokenize("I'm a southern salesman.")
# ['I', "'m", 'a', 'southern', 'salesman', '.']

tokens = list(filter(lambda token: token not in string.punctuation, tokens))
# ['I', "'m", 'a', 'southern', 'salesman']

...そして、必要に応じて、'mなどの特定のトークンをamに置き換えることができます。

0
Bora M. Alper

@rmaloufによってソリューションに追加するだけで、\ w +は[a-zA-Z0-9_]と同等であるため、これには数字が含まれません。

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'[a-zA-Z]')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')
0