2011-01-08 6 views
19

PythonのNLTKには、テキスト内の単語の頻度を示す関数FreqDistがあります。私はテキストを引数として渡そうとしていますが、結果は次の形式です:[''、 'e'、 'a'、 'o'、 'n'、 'i'、 't'、 'r' 's'、 'l'、 'd'、 'h'、 'c'、 'y'、 'b'、 'u'、 'g'、 '\ n'、 'm'、 'p' '' '' '' '' '' '' '' '' '' '' '' '9' '' '' '' '' '' '' '' '' '' '' ' 「A」「G」「P」「T」「W」「〔〕」「」「」「」「〜」「〜」「〜」「〜 )、 '0'、 '7'、 'E'、 'J'、 'O'、 'R'、 'j'、 'x']のようになります。 。イムは、それをこのように手紙をやって:FreqDist with NLTK

file_y = open(fileurl) 
p = file_y.read() 
fdist = FreqDist(p) 
vocab = fdist.keys() 
vocab[:100] 

あなたは私が間違っているのplsを持っているか知っていますおかげ

+0

例へのリンクを追加してください。 –

+0

NB、より良いPythonのイディオムは、 'file_y:...'または 'open(ファイルのURL):' – smci

答えて

32

FreqDistは、トークンの反復可能を期待した文字列が反復可能である---イテレータはすべての文字を生成します?!。。

最初にテキストをトークナイザに渡し、トークンをFreqDistに渡します。

+0

のためのオープン(fileurl)と同じです。実際にはありますが、docstringは* anywhere *エラーメッセージを出さなくても、 '__init __()'がイテレータ以外の入力に対してエラーメッセージを出したり、シーケンスを受け取りイテレータに変換したりするのは簡単ではありません。 – smci

+1

@ afg102もしうまくいけば、その答えを受け入れて、他の人も問題の解決策を知っているようにしてください。 – rishi

12

NLTKのFreqDistは任意の反復可能なものを受け入れます。文字列が文字ごとに反復されるので、あなたは経験している方法で物を引き離しています。

単語数をカウントするには、FreqDist語を入力する必要があります。あなたはどうやってそれをしますか?さて、ファイル全体をnltk.tokenize.word_tokenizeに送ると思うかもしれません(他の人があなたの質問に対する答えに示唆しているように)。

>>> # first, let's import the dependencies 
>>> import nltk 
>>> from nltk.probability import FreqDist 

>>> # wrong :(
>>> words = nltk.tokenize.word_tokenize(p) 
>>> fdist = FreqDist(words) 

word_tokenize文から単語モデルを構築します。一度に1つの文を1つずつ入力する必要があります。全パラグラフや文書が与えられても、比較的貧弱な仕事をします。

だから、どうしたらいいですか?簡単、文章トークナイザを追加!

>>> fdist = FreqDist() 
>>> for sentence in nltk.tokenize.sent_tokenize(p): 
...  for word in nltk.tokenize.word_tokenize(sentence): 
>>>   fdist[word] += 1 

テキストをトークン化する方法はたくさんあります。モジュールnltk.tokenize.sent_tokenizeとは、比較的きれいな英語のテキストに対して合理的なデフォルトを選択するだけです。いくつかの選択肢がありますが、API documentationで読むことができます。

+0

OPは手紙の頻度を望ましくありません! (他に誰もいない...)彼らは言葉の頻度が欲しい。 – smci

+0

実際、文字の頻度は自動言語検出の非常に一般的な機能です。 –

+0

真実、そのニッチです。また復号化。一般的にはあまりありません。 – smci

18

FreqDistはトークンの配列で動作します。変数FDISTがある

import nltk 
from nltk import FreqDist 

sentence='''This is my sentence''' 
tokens = nltk.word_tokenize(sentence) 
fdist=FreqDist(tokens) 

:あなたは、単にこのようにそれを使用する必要が

words = nltk.tokenize.word_tokenize(p) 
fdist = FreqDist(words) 
4

を:あなたはそれあなたが最初の入力をトークン化している必要があります文字の配列(文字列)を送っていますクラス "nltk.probability.FreqDist"型の単語の頻度分布を含んでいます。

0

nltk tokenizerに依存したくない場合は、単に文字列分割を使用できます。

sentence = "This is some text" 
print(sentence.split(' '))