2012-04-05 2 views
2

가능한 목록 문자열 (토큰 화 된 문자열)을 가능한 각 하위 문자열로 나누려고합니다. 가장 일반적인 하위 문자열을 찾으려면 각 하위 문자열에서 FreqDist를 실행하고 싶습니다. 첫 번째 부분은 잘 작동합니다. 나는 FreqDist을 실행할 때, 다음과 같은 에러가 발생합니다파이썬 빈도 분포 (FreqDist/NLTK) 문제

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의 출력은 괜찮 :

TypeError: unhashable type: 'list' 

가 여기 내 코드입니다. 여기에 있습니다 :

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

그러나 FreqDist를 실행할 수 없습니다. 어떤 통찰력이라도 대단히 감사하겠습니다. 이 경우 각 하위 문자열은 FreqDist가 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> 

은 당신이 찾고있는 무엇인가요?