2

単語のリスト (トークン化された文字列) を可能な各部分文字列に分割しようとしています。次に、各部分文字列で FreqDist を実行して、最も一般的な部分文字列を見つけたいと思います。最初の部分は正常に動作します。ただし、FreqDist を実行すると、次のエラーが表示されます。

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 を実行することはできません。どんな洞察も大歓迎です。この場合、各部分文字列の FreqDist は 1 しかありませんが、このプログラムは、はるかに大きなテキスト サンプルで実行することを意図しています。

4

1 に答える 1

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>

それはあなたが探しているものですか?

于 2012-04-05T15:41:23.510 に答える