2012-04-05 13 views
2

単語のリスト(トークン化された文字列)を各部分文字列に分割しようとしています。私は次に、最も一般的な部分文字列を見つけるために、各部分文字列でFreqDistを実行したいと思います。最初の部分は正常に動作します。しかし、私はFreqDistを実行すると、私はエラーを取得:Python頻度分布(FreqDist/NLTK)問題

TypeError: unhashable type: 'list' 

ここに私のコードです:

import nltk 

string = ['This','is','a','sample'] 
substrings = [] 

count1 = 0 
count2 = 0 

for word in string: 
    while count2 <= len(string): 
     if count1 != count2: 
      temp = string[count1:count2] 
      substrings.append(temp) 
     count2 += 1 
    count1 +=1 
    count2 = count1 

print substrings 

fd = nltk.FreqDist(substrings) 

print fd 

substringsの出力で結構です。ここにあります:

[['This'], ['This', 'is'], ['This', 'is', 'a'], ['This', 'is', 'a', 'sample'], ['is'], ['is', 'a'], ['is', 'a', 'sample'], ['a'], ['a', 'sample'], ['sample']] 

しかし、私はFreqDistを実行できません。どんな洞察力も大変高く評価されます。この場合、各部分文字列は1のFreqDistしか持たないが、このプログラムははるかに大きなテキストのサンプルで実行されることを意図している。

答えて

6

私はあなたが何を望んでいるかはっきりしていませんが、通常、それをセットに入れたり、辞書のキーとして使用している記号であるリストをハッシュしたいというエラーメッセージが表示されます。代わりにタプルを与えることでこれを回避することができます。

>>> import nltk 
>>> import itertools 
>>> 
>>> sentence = ['This','is','a','sample'] 
>>> contiguous_subs = [sentence[i:j] for i,j in itertools.combinations(xrange(len(sentence)+1), 2)] 
>>> contiguous_subs 
[['This'], ['This', 'is'], ['This', 'is', 'a'], ['This', 'is', 'a', 'sample'], 
['is'], ['is', 'a'], ['is', 'a', 'sample'], ['a'], ['a', 'sample'], 
['sample']] 

我々はまだ我々はタプルにサブ配列を作る場合は、しかし

>>> fd = nltk.FreqDist(contiguous_subs) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/dist-packages/nltk/probability.py", line 107, in __init__ 
    self.update(samples) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/probability.py", line 437, in update 
    self.inc(sample, count=count) 
    File "/usr/local/lib/python2.7/dist-packages/nltk/probability.py", line 122, in inc 
    self[sample] = self.get(sample,0) + count 
TypeError: unhashable type: 'list' 

を持っている:

>>> contiguous_subs = [tuple(sentence[i:j]) for i,j in itertools.combinations(xrange(len(sentence)+1), 2)] 
>>> contiguous_subs 
[('This',), ('This', 'is'), ('This', 'is', 'a'), ('This', 'is', 'a', 'sample'), ('is',), ('is', 'a'), ('is', 'a', 'sample'), ('a',), ('a', 'sample'), ('sample',)] 
>>> fd = nltk.FreqDist(contiguous_subs) 
>>> print fd 
<FreqDist: ('This',): 1, ('This', 'is'): 1, ('This', 'is', 'a'): 1, ('This', 'is', 'a', 'sample'): 1, ('a',): 1, ('a', 'sample'): 1, ('is',): 1, ('is', 'a'): 1, ('is', 'a', 'sample'): 1, ('sample',): 1> 

は、あなたが探しているものということですか?

関連する問題