我与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]
答案 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
,因此可能来自您代码中的其他位置。
那就是其他各种评论:
您似乎明白了collections.Counter
的作用,但是您在构建uni
时偶然尝试自己做 - 您可以用以下代码替换您的第一块代码:
unigrams = Counter(sp)
您可以使用zip
迭代对并以这种方式构建您的双字母组合,而不是DIY循环它,这也消除了您的''
问题:
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.
答案 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
中使用的密钥。