计算多个文件中的单词频率

时间:2018-03-25 21:53:00

标签: python python-3.x frequency word-frequency

我正在尝试编写一个代码来计算包含大约10000个文件的文档中出现单词的频率,但是我得到的是最后一个文件的单词计数,因为它会覆盖之前的迭代次数。 。到目前为止我的代码是:

import csv
import glob
import re


def main():
    file_list = glob.glob(TARGET_FILES)
    for file in file_list:
        with open(file, 'r', encoding='UTF-8', errors='ignore') as f_in:
             doc = f_in.read()

 def get_data(doc):    

     vdictionary = {}
     w = csv.writer(open("output1.csv", "w",newline=''))
     tokens = re.findall('\w+', doc)  
     for token in tokens:
        if token not in vdictionary:
             vdictionary[token] = 1
        else:
             vdictionary[token] += 1
     for key, val in vdictionary.items():
        w.writerow([key, val])

2 个答案:

答案 0 :(得分:1)

我认为你的问题是每次调用get_data时,你只用该文件中的计数重写csv(我认为)。相反,也许你可以创建一个字典,然后对所有文件进行每个文件中每个单词的计数,然后输出到w.writerow([key, val])

基本上,每次浏览文件时都不要输出到csv。浏览所有文件,更新一个主字典,然后输出到csv。

答案 1 :(得分:0)

我认为问题是你每次迭代都会清空csv文件。如果你使用会发生什么:

w = csv.writer(open("output1.csv", "a",newline=''))

而不是

w = csv.writer(open("output1.csv", "w",newline=''))

?我怀疑你会得到每个文件的计数。如果是这种情况,您应该创建一个字典,为每个文件更新该字典,并且只在最后将其写入csv文件。

你可以得到一个这样的字典:

 def get_data(doc, vdictionary):
     tokens = re.findall('\w+', doc)  
     for token in tokens:
         if token not in vdictionary:
             vdictionary[token] = 1
         else:
             vdictionary[token] += 1
     return vdictionary

 def main():
     files = {get your files}
     vdictionary = {}
     for file in files:
           vdictionary = get_data(file, vdictionary)
     w = csv.writer(open("output1.csv", "w",newline=''))
     for key, val in vdictionary.items():
        w.writerow([key, val])