我正在为一门涉及计算双字母字母对频率的课程工作。我们自己实现它,而不是使用任何具有强大版本的库中的任何库。
赋值很简单,但在构建我的模型时,我在尝试迭代键时看到了一些非常奇怪的行为,我有一个Python问题。我只是将文本拆分为一个字符列表,然后将每个二元组以其频率存储在dict
中。所以dict
就像{ 'aa': 7, 'ab' : 9, ... }
。我想,这很容易。
尝试迭代dict
来探索数据,我正在使用一个简单的for循环:
for k in frequencies:
print 'bigram: %s frequency: %s' % (k, frequencies[k])
对于大多数双字母组合都可以正常工作,但是在整个输出中都有一些非常奇怪的输出,如下所示:
bigram: Ab frequency: 14
bigram: e; frequency: 29
frequency: 4
bigram: l? frequency: 4
bigram: -p frequency: 1
A frequency: 36
正如您所看到的,有许多行没有打印整个格式化字符串。
我尝试通过在构建它们时打印出两个字母来调试它,如下所示:
print 'letter one: |' + first_letter + '| letter two: `' + second_letter + '`'
这导致一些行的奇数输出相同,其输出字符串的第一部分被忽略:
letter one: |t| letter two: `.`
`
| letter two: `T`
letter one: |T| letter two: `h`
这样做,我注意到它似乎是.
个字符导致某些问题,但不是所有情况,所以我修改了两字母分析器以跳过包含非字母数字字符的bigrams,但得到了相同的的问题。似乎some_dict['.T']
应该没问题,关键是可以清洗等等。
我的问题:为什么输出(看似)被破坏了?什么可能导致这些格式字符串忽略它们的第一部分?
使用Python 2.7.5,如果重要的话。在Mac OS X和Ubuntu 12.04上输出相同。
答案 0 :(得分:3)
您的双字母组中有控制字符可以清除该行,或将打印位置返回到行的开头(通常为ASCII codepoint 0x0D,\r
,CARRIAGE RETURN)。
使用%r
来打印字符串文字表示,而不是用python字符串转义码代替控制字符:
for k in frequencies:
print 'bigram: %r frequency: %s' % (k, frequencies[k])
作为旁注,您可能需要查看collections.Counter()
来收集二元频率;它是dict
的子类,它为您添加了几个细节,例如为您计算频率,以及列出最常见元素的方法(按排序顺序)。