2012-03-25 14 views
0

私は与えられたテキスト(それはテキストの長さの関数として語彙サイズの成長を示している)のヒープの法則をプロットしようとしています。つまり、各トークンについて、テキストの長さとトークンサイズまでのトークンが必要ですHeaps law in Python

私はすでにテキストをトークン化していますが、すべての単語を繰り返し処理する方法がわからないため固執していますテキスト

tokens=nltk.wordpunct_tokenize(text) 
it=len(tokens) 
i=1 
for word in tokens: 
    print len(tokens), len(set(tokens)) 
    i=i+1 
    if i>it: 
     break 

私は基本的にテキストが1トークンだけ拡大するように各繰り返しを行う必要があります。 ご協力いただきありがとうございます!

答えて

1

tokensは、NLTKによって一度設定された配列です。それを反復するにつれてそれは成長しません。だから、len(tokens)はすべての反復で同じになります。あなたはすでにiにカウントを蓄積しているので。 len(tokens)の代わりにそれを使用してください。

ユニークな数については、同じ問題があります。 set(tokens)は、これまで通り過ぎたものではなく、常にフルセットです。あなたはあなたが行くように既知の単語のセットを蓄積する必要があります:

i = 0 
words = set() 
for word in tokens: 
    words.add(word) 
    i += 1 
    print i, len(words) 

編集:愚か私は列挙を忘れました。 iを明示的にカウントしないようにする方法については、Dvir Volkの答えを参照してください。

1

for word in tokens:すべてが必要ですか?カウントする必要はなく、すべてのトークンが使い尽くされた後にループが終了します。
ループの内部では、word変数を調べて、必要な計算を行います。

別個の単語を数えたい場合は、set(tokens)を使用できます。
セットには同じ単語を1回だけ含めることができるので、len(set(tokens))は別個の単語の数です。 。また、あなたはカウンタをインクリメント避けるためにenumerateを使用することができますセット(for word in set(tokens):

3

にitereateことができます。

uniq = set() 

for i, token in enumerate(tokens): 
    uniq.add(token) 
    print "%d => %d" % (i, len(uniq))