2016-10-04 13 views
1

bigrams 및 unigrams로 작업하고 있습니다.Python의 목록에있는 요소에 액세스 할 수 없습니다.

내 bigrams는 튜플의 카운터입니다 내 unigrams이

uni['some key']=count 

내가 follwing을

for b,countB in bigrams.most_common() 
     key=b[0] # this is guaranteed to be a key for my unigrams 
     uniCount=uni[key] 

다음과 같은 오류를 수행하려고 목록입니다 발생합니다

TypeError: tuple indeces must be integers or slices, not str 

혼란 스럽습니다. 왜 이것이 문제가되어야합니까? uni는 본질적으로 해시이며 키 값은 문자열입니다. 어떻게 [key]에 액세스 할 수 있습니까?

편집 : 당신은 아마 사전을 필요로 할 때 튜플을 사용하는 실수를하고있다

# corpus is a string containing my corpus 
sp=corpus.split() 

uni={} 
for t in sp: 
     try: 
      uni[t]+=1 
     except: 
      uni[t]=0 
prev='' 
big=[] 
for t in sp: 
     tup=(prev,t) 
     big.append(tup) 
     prev=t 

bigrams=collections.Counter(big) 

for b,countB in bigrams.most_common(): 
     key=b[0] 
     uniCount=uni[key] 
+0

당신이'인쇄 (수행 할 때 당신은 무엇을 어떻게해야합니까 "{}"형식 (키))''key = b [0]'바로 뒤에? – Samundra

+2

더 많은 코드가 필요합니다. 오류에 따르면'uni'는'dict'이라고 주장하면서'튜플 (tuple) '이라고 생각합니다. – tzaman

+0

실제로 "my unigrams is a list"는 uni [ 'some key'] = count' 예제와 충돌합니다. 목록은 그런 식으로 색인을 생성 할 수 없습니다. – jez

답변

1

귀하의 코드를 시도했으며 KeyError: ''이 발생했습니다. 이는 초기 bigram이 0 위치에 빈 문자열을 갖고 unigrams 사전에 ''이 없기 때문에 발생합니다. 나는 TypeError을 보지 않았으므로 코드의 다른 곳에서 온 것일 수 있습니다. 말했다

, 다양한 의견 :

  1. 당신은 collections.Counter가 무엇을 이해하는 것,하지만 당신은 아무렇게나 uni를 구축하는 동안 스스로를하려고 노력하고 있습니다 - 당신이 코드의 첫 번째 덩어리를 대체 할 수 로 :

    unigrams = Counter(sp)

  2. 당신은, 이는 그것을 쌍을 반복하고 bigrams 그런 식으로 구성하는 대신 DIY의 반복하는 zip을 사용할 수 있습니다 LSO이 '' 문제를 제거한다 :

    bigrams = Counter(zip(sp, sp[1:]))

그래서 코드가된다 :.

sp = corpus.split() 
unigrams = Counter(sp) 
bigrams = Counter(zip(sp, sp[1:])) 

for bigram, count in bigrams.most_common(): 
    # etc. 
+0

두 번째 요점을 완전히 이해하지 못했습니다. – basil

+0

@basil'zip '은 여러 시퀀스를 반복하여 쌍을 만듭니다. 'sp [1 :]'는 같은리스트의 두번째 요소입니다. 그래서'zip (sp, sp [1 :])'은 (두 번째 루프에서 수동으로'big '을 만드는 대신) 모든 bigram 튜플을 생성합니다. 메인 포스트에'zip'에 대한 문서 링크를 추가했습니다. – tzaman

3

전체 코드. 오류 메시지 상태로 튜플은 문자열 키로 인덱싱 할 수 없습니다. 숫자 인덱스를 사용해야합니다.

dict를 사용하면 원하는대로 문자열 키를 사용할 수 있습니다.

d = {} 
d['some key] = 23 

업데이트 된 코드는 자신이하는 일에 대해 훨씬 잘 알 수 있습니다. uni에 단어 수 사전을 작성하는 것으로 시작하십시오. 그 지점이 실행될 때 당신은 단어의 첫 발생을 감지하기 때문에

uni[t] = 0 

읽어 줄 사실

uni[t] = 1 

을 읽을한다고 생각합니다. 다음으로 big에 bigram 튜플 목록을 만든 다음 그 bigram을 계산합니다.

내가 마지막 for 루프 손실을 조금 얻을하지만, b 카운트 될 수있는 Counter 항목의 키와 countB 될 곳. 따라서 key이 bigram의 첫 번째 단어이고 uniCount은 해당 단어가 코퍼스에 표시된 횟수입니다. 이러한 가치를 확립 한 후에는 아무 것도하지 않고 가장 일반적인 다음 bigram로 이동하십시오.

아마 마지막 루프에서 인쇄 할 시간이 되었습니까? 달리 게시 된 코드는 합리적으로 보입니다.

+0

내 용어가 올바른지 확실하지 않습니다. 나는 익숙하지 않은 언어를 사용하여 문제를 풀려고하는 실수를 저지르고있다. 위의 코드를 추가했습니다. – basil

+0

확장 코드를 더 자세히 분석하여 업데이트되었습니다. – holdenweb

+0

또한 다른 답변에서 언급했듯이 첫 번째 bigram은 현재 빈 문자열을 첫 번째 요소로 가지며 이것이 가장 일반적인 bigram 중 하나 인 경우 문제를 일으킬 수 있습니다 (단락구에있을 수 있음).). – holdenweb

0

으로 코드를 실행했습니다. 오류는 터플 인 uni과 관련되었지만 실제로는 사전이라고했기 때문에 코드를 실행했습니다. 내가 가진 오류는 다른

, 그것은 당신이 튜플 (previous word, word)의 목록과 corpus의 첫 번째 단어를 만드는 때문에 uniCount=uni[key]KeyError 인 빈 문자열로 설정 이전 단어를 (prev='' 초기 상태)가 있습니다. uni 사전 그것이 KeyError 던지고에는 키 '' 없기 때문에

uniCount=uni[key] 선에서 키 정도로 튜플 (key=b[0])의 첫 번째 항목으로 동일하다.

튜플의 이전 단어가 uni에서 사용 된 키가 아니라 단어를 가져오고 싶을 수 있습니다.

관련 문제