我有一系列文件,每个文件都包含单词数。 每个文件可以有不同的单词。这是一个例子:
FILEA
word1,20
word2,10
word3,2
FILEB:
word1,10
word4,50
word3,5
大约有20k个文件,每个文件最多可以包含数万个单词。
我最终想要构建一个稀疏矩阵,其中每一行代表一个文件的字分布,就像你从scikit's CountVectorizer得到的那样。
如果word1,word2,word3,word4是列,那么anf FileA和FileB是行,那么我希望得到:
[[20,10,2,0],[10,0,5,50]]
我怎么能这样做? 如果可能的话,我还希望能够只包含出现在至少N个文件中的单词。
答案 0 :(得分:1)
你可以使用一些字典来映射单词的出现频率,将文件名映射到这些文件中的单词计数。
files = ["file1", "file2"]
all_words = collections.defaultdict(int)
all_files = collections.defaultdict(dict)
for filename in files:
with open(filename) as f:
for line in f:
word, count = line.split(",")
all_files[filename][word] = int(count)
all_words[word] += 1
然后,您可以使用嵌套列表推导中的那些来创建稀疏矩阵:
>>> [[all_files[f].get(w, 0) for w in sorted(all_words)] for f in files]
[[20, 10, 2, 0], [10, 0, 5, 50]]
或按最小字数过滤:
>>> [[all_files[f].get(w, 0) for w in sorted(all_words) if all_words[w] > 1] for f in files]
[[20, 2], [10, 5]]