无法访问Python中列表中的元素

时间:2016-10-04 14:06:29

标签: python nlp tuples n-gram

我与bigrams和unigrams合作。

我的双胞胎是元组的反击,我的unigrams是一个列表,其中

 uni['some key']=count

我正在努力做到这一点

 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本质上是一个哈希,它的键值是字符串。我如何访问你的[密钥]?

编辑:完整代码

 # 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]

3 个答案:

答案 0 :(得分:3)

当你需要字典时,你犯了使用元组的错误。作为错误消息状态,元组不能通过字符串键索引 - 您应该使用数字索引。

dict会让你按照你想要的那样使用字符串键。

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

您的更新代码可以更好地了解您的工作。首先,在uni中创建一个单词计数字典。我认为这行

uni[t] = 0

实际上应该阅读

uni[t] = 1

因为当执行该分支时,您正在检测第一次出现的单词。接下来,在big中创建一个bigram元组列表,然后计算那些双字母组。

我在最后的for循环中有点迷失,其中b将是Counter项的关键,countB是计数。因此key将成为双字母组的第一个单词,而uniCount将是该单词出现在语料库中的次数。确定了这些价值后,你就不再对它们采取任何行动了,继续下一个最常见的二元游戏。

也许是时候在最后一个循环中做一些打印了?否则发布的代码看起来很合理。

答案 1 :(得分:1)

我尝试了你的代码并得到了一个KeyError: '',因为你的初始二元组在位置0有一个空字符串,而''不在你的unigrams字典中。我没有看到TypeError,因此可能来自您代码中的其他位置。

那就是其他各种评论:

  1. 您似乎明白了collections.Counter的作用,但是您在构建uni时偶然尝试自己做 - 您可以用以下代码替换您的第一块代码:

    unigrams = Counter(sp)

  2. 您可以使用zip迭代对并以这种方式构建您的双字母组合,而不是DIY循环它,这也消除了您的''问题:

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

  3. 所以你的代码变成了:

    sp = corpus.split()
    unigrams = Counter(sp)
    bigrams = Counter(zip(sp, sp[1:]))
    
    for bigram, count in bigrams.most_common():
        # etc. 
    

答案 2 :(得分:0)

我已经使用corpus = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore"执行了您的代码,因为您说错误与uni是一个元组有关,但它实际上是一个字典。

我得到的错误不同,它是KeyError上的uniCount=uni[key],因为您正在创建元组(previous word, word)列表,corpus的第一个单词有前一个字设置为空字符串(prev=''是初始状态)。

uniCount=uni[key]行的键等于元组的第一项(key=b[0]),因为''字典中没有键uni投掷KeyError

您可能希望将单词,而不是元组的前一个单词作为uni中使用的密钥。