文档频率(Document Frequency,DF)是指在一个文档集中,某个词语出现的文档数量。计算每个词语的文档频率可以帮助我们了解该词语在整个文档集合中的重要性和普遍程度。
读取新闻语料库文件,处理得到每个词语的文档频率,并存储在文件中
import jieba # 中文分词词库 doc_total_count = 1411996 # 文档集合中的文档总数,自查 doc_freq_dict = {} # 空字典用于存储词语的频率信息 # process_doc函数是一个用于处理文档的函数。它接受一个参数doc_text,表示待处理的文本。 # 在函数内部,使用jieba.lcut函数对文本进行分词操作,并将结果转换为一个集合(set)返回 def process_doc(doc_text): return set(jieba.lcut(doc_text)) # 读取一个名为’news_sohusite_xml.dat’的文件,并对文件中的内容进行处理 # 使用with open()语句打开文件,并指定文件的编码方式为’gbk’,忽略编码错误 with open('news_sohusite_xml.dat', 'rt', encoding='gbk', errors='ignore') as fo: doc_count = 0 # 初始化变量doc_count为0,用于记录处理的文档数量 temp_str = '' # 初始化变量temp_str为空字符串,用于暂存每个文档的内容 for line in fo: # 使用for循环遍历文件中的每一行 if line.startswith('<contenttitle>'): temp_str += line[14:-16] # 如果当前行以'<contenttitle>'开头,则将行中的内容(去除前后标签)添加到temp_str中 elif line.startswith('<content>'): temp_str += ' ' + line[9:-11] # 如果当前行以'<content>'开头,则将行中的内容(去除前后标签)添加到temp_str中,并在前面加上一个空格 elif line.startswith('</doc>'): doc_count += 1 # 如果当前行以’</doc>'开头,则表示一个文档的处理结束,将temp_str中的内容进行处理 if doc_count % 1000 == 0: # 每处理完1000个文档,打印出当前处理进度 print("当前已处理:{:.4%}".format(doc_count / doc_total_count)) words_set = process_doc(temp_str) for word in words_set: doc_freq_dict[word] = doc_freq_dict.get(word, 0) + 1 # 对处理后的文档内容进行处理,将其中的单词添加到doc_freq_dict字典中,更新单词的出现频率 temp_str = '' # 清空temp_str,准备处理下一个文档 print('文档总数量:', doc_count) # 循环结束后,打印出总共处理的文档数量 # 将一个字典中的键值对按照值的大小进行排序,并将排序结果写入到一个文本文件中 word_freq_list = list(doc_freq_dict.items()) # 将字典doc_freq_dict转换为一个包含键值对的列表word_freq_list word_freq_list.sort(key=lambda item:item[1], reverse=True) # 使用sort()函数对word_freq_list进行排序,并且按照降序排列 # 以写入模式打开一个名为’result.txt’的文本文件 # 通过一个循环遍历word_freq_list中的每个元素,将每个元素的键和值按照指定的格式写入到文件中,格式为'{}\t{}\n',其中{}表示占位符,分别对应键和值 with open('result.txt', 'wt') as fw: for word, freq in word_freq_list: fw.write('{}\t{}\n'.format(word, freq))