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
我从这段代码得到的结果:
这种格式的字典:
term< - [[docnumber,term freq] [docnumber,term freq]]
例如:如果单词cat出现在doc 1.txt中三次,而Doc 3.txt出现两次:
我明白了:
cat< - [[1,1],[1,1],[1,1],[3,1] [3,1]]
因此,我希望将[1,3]添加到列表中而不是[1,1]三次
我不知道如何摆脱列表中重复的成员并增加术语freq。
我应该得到什么:
cat< - [[1,3],[3,2]],即Doc 1中三次,doc 3中两次。
我已经尝试了解决方法,但是我一直都会遇到访问错误。
提前致谢。
答案 0 :(得分: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})
答案 1 :(得分: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
在继续下一个文档之前,请更新all_word_counts
for word, count in word_count.iteritems():
all_word_counts[word].append([docnumber, count])