字典中的嵌套列表:访问字典内列表的成员
def index_dir(self, base_path):
num_files_indexed = 0
allfiles = os.listdir(base_path)
self._documents = os.listdir(base_path)
num_files_indexed = len(allfiles)
docnumber = 0
self._inverted_index = collections.defaultdict(list)
docnumlist = []
for file in allfiles:
self.documents = [base_path+file] #list of all text files
f = open(base_path+file, 'r')
lines = f.read()
tokens = self.tokenize(lines)
docnumber = docnumber + 1
for term in tokens:
# check if the key/term already exists in the dictionary,
# if yes, just add a new key value/term into the dict
if term not in sorted(self._inverted_index.keys()):
newlist=[]
tf=1
self._inverted_index[term] = []
#self._inverted_index[term][docnumber] +=1
newlist.append(docnumber)
newlist.append(tf)
self._inverted_index[term].append(newlist) #appending list to a list
else:
if docnumber not in self._inverted_index.get(term):
newlist=[]
tf=1
newlist.append(docnumber)
newlist.append(tf)
self._inverted_index[term].append(newlist)
f.close()
print '\n \n'
print 'Dictionary contents: \n'
for term in sorted(self._inverted_index):
print term, '->', self._inverted_index.get(term)
return num_files_indexed
return 0
从这段代码中我了解到:
字典的格式是这样的:
词汇 <- [[文档编号, 词频][文档编号, 词频]]
举个例子:如果“猫”这个词在1.txt文档中出现了三次,而在3.txt文档中出现了两次:
我得到的是:
猫 <- [[1,1],[1,1],[1,1],[3,1],[3,1]]
所以,我不想要[1,1]出现三次,而是想要[1,3]加到列表里。
我不知道怎么去掉列表中的重复项,并且增加词频。
我想要的结果是:
猫 <- [[1,3],[3,2]] 也就是说在1号文档中出现三次,在3号文档中出现两次。
我尝试了很多方法,但总是出现访问错误。
提前谢谢你。
2 个回答
0
最终的统计结果:
{'cat':[[1,3], [3,2]]}
当前文档中的单词:
{'cat':3}
我很喜欢你选择使用defaultdict。这样做可以实现以下功能,并且比逐个遍历键要快。
from collections import defaultdict
all_word_counts = defaultdict(list)
all_word_counts['cat'].append([1, 3])
首先统计给定文档中的单词频率
word_count = defaultdict(int) #reset each document
for term in self.tokenize(lines):
word_count[term] += 1
在进入下一个文档之前,更新所有单词的统计数据
for word, count in word_count.iteritems():
all_word_counts[word].append([docnumber, count])
0
>>> from itertools import groupby
>>> from operator import itemgetter
>>> cat = [[1,1],[1,1],[1,1],[3,1],[3,1]]
>>> [(k,len(list(v))) for k, v in groupby(cat,itemgetter(0))]
[(1, 3), (3, 2)]
这段代码会修复你的问题。但这并不能解决代码为什么一开始就出错的根本原因!解决办法是使用collections.Counter
这个类,只要你给它一个单词列表,它就能帮你完成工作。
>>> words = "Lorem ipsum dolor sit ames, lorem ipsum dolor sit ames.".split(" ")
>>> Counter(words)
Counter({'ipsum': 2, 'sit': 2, 'dolor': 2, 'lorem': 1, 'ames.': 1, 'ames,': 1, 'Lorem': 1})
>>> Counter(map(str.lower, words))
Counter({'ipsum': 2, 'sit': 2, 'dolor': 2, 'lorem': 2, 'ames.': 1, 'ames,': 1})