【发布时间】:2010-06-13 08:49:12
【问题描述】:
这是一个我已经绞尽脑汁很久的问题,所以任何帮助都会很棒。我有一个文件,其中包含以下格式的几行(单词,单词出现的时间,以及在给定实例中包含给定单词的文档的频率)。下面是输入文件的示例。
#inputfile
<word, time, frequency>
apple, 1, 3
banana, 1, 2
apple, 2, 1
banana, 2, 4
orange, 3, 1
我有下面的 Python 类,我用来创建二维字典来存储上述文件,使用作为键,频率作为值:
class Ddict(dict):
'''
2D dictionary class
'''
def __init__(self, default=None):
self.default = default
def __getitem__(self, key):
if not self.has_key(key):
self[key] = self.default()
return dict.__getitem__(self, key)
wordtime=Ddict(dict) # Store each inputfile entry with a <word,time> key
timeword=Ddict(dict) # Store each inputfile entry with a <time,word> key
# Loop over every line of the inputfile
for line in open('inputfile'):
word,time,count=line.split(',')
# If <word,time> already a key, increment count
try:
wordtime[word][time]+=count
# Otherwise, create the key
except KeyError:
wordtime[word][time]=count
# If <time,word> already a key, increment count
try:
timeword[time][word]+=count
# Otherwise, create the key
except KeyError:
timeword[time][word]=count
我的问题与在迭代此 2D 字典中的条目时计算某些事物有关。对于每个时间 't' 的每个单词 'w',计算:
- 具有的文档数 单词“w”在时间“t”内。 (一)
- 没有的文档数 单词“w”在时间“t”内。 (b)
- 具有的文档数 单词'w'在时间't'之外。 (c)
- 没有的文档数 单词'w'在时间't'之外。 (d)
上面的每个项目代表每个单词和时间的卡方列联表的一个单元格。所有这些都可以在一个循环中计算,还是需要一次完成一个?
理想情况下,我希望输出如下所示,其中 a、b、c、d 是上面计算的所有项目:
print "%s, %s, %s, %s" %(a,b,c,d)
在上述输入文件的情况下,尝试在时间 '1' 查找单词 'apple' 的列联表的结果将是 (3,2,1,6)。我将解释如何计算每个单元格:
- “3”个文档中包含“apple” 时间“1”。
- 在时间内有“2”个文档 不包含“apple”的“1”。
- 有“1”个文档包含 'apple' 在时间 '1' 之外。
- 时间外有6个文件 '1' 不包含单词 '苹果' (1+4+1)。
【问题讨论】:
-
dict.has_key()已过时、已弃用且速度较慢。而不是d.has_key(k)使用k in d。另一张海报提到了defaultdict。考虑更新您正在使用的教程/书籍。 -
@JohnMachin 谢谢,我一定会牢记这一点。
标签: python dictionary discrete-mathematics