语料库特定词高效查找及低频词过滤方法优化问询
嘿,针对你现在处理10份HTML文档构建带权重词文档的低效流程,我给你整理了一个更顺畅的优化方案,核心就是避免重复的磁盘IO操作,把所有步骤尽量放在内存里完成:
高效优化方案:一次流程完成分词、统计、过滤与权重计算
核心思路
原方案先把每份文档的分词结果写入文件,再重新读取做频次校验,这多了一轮不必要的磁盘读写——对于10份文档来说,完全可以把所有数据放在内存里处理,大幅提升效率。
步骤1:一次性完成所有文档的分词与全局词频统计
遍历所有HTML文档,一边解析分词,一边用计数器统计全局词频,同时把每份文档的分词结果存在内存里:
from collections import Counter from bs4 import BeautifulSoup import nltk from nltk.tokenize import word_tokenize import os # 确保nltk分词所需的数据包已下载 nltk.download('punkt') # 初始化全局词频计数器和文档分词存储列表 global_word_counts = Counter() doc_token_list = [] # 遍历目标目录下的所有HTML文件 for file_name in os.listdir("your_html_folder_path"): if file_name.endswith(".html"): file_path = os.path.join("your_html_folder_path", file_name) with open(file_path, 'r', encoding='utf-8') as f: # 解析HTML提取纯文本 soup = BeautifulSoup(f, 'html.parser') raw_text = soup.get_text() # 分词+基础预处理(转小写、只保留字母词,可按需调整) tokens = word_tokenize(raw_text) cleaned_tokens = [token.lower() for token in tokens if token.isalpha()] # 保存当前文档的分词结果 doc_token_list.append(cleaned_tokens) # 更新全局词频统计 global_word_counts.update(cleaned_tokens)
步骤2:生成过滤后的有效词表
基于全局词频,直接筛选出出现次数≥5的词:
# 只保留出现次数不少于5次的词 valid_words = {word for word, count in global_word_counts.items() if count >= 5}
步骤3:构建带权重的文档表示
用之前存在内存里的每份文档分词结果,结合有效词表,直接计算权重(这里以TF词频权重为例,你也可以换成TF-IDF等):
weighted_documents = [] for tokens in doc_token_list: doc_word_counts = Counter(tokens) total_tokens = len(tokens) # 生成当前文档的权重字典,只保留有效词 weighted_doc = { word: count / total_tokens # TF权重:词在文档中的占比 for word, count in doc_word_counts.items() if word in valid_words } weighted_documents.append(weighted_doc)
步骤4:按需写入结果文件(可选)
如果最终需要把带权重的文档保存到文件,这时候再一次性写入,而不是中间多次操作:
# 把每个带权重的文档写入单独文件 for idx, doc in enumerate(weighted_documents): with open(f"weighted_document_{idx+1}.txt", 'w', encoding='utf-8') as f: for word, weight in doc.items(): f.write(f"{word}: {weight:.4f}\n") # 保留四位小数更整洁
为什么这个方案更高效?
磁盘IO是程序性能的常见瓶颈,原方案的两次文件读写(写分词→读分词)完全是冗余操作。优化后的方案全程在内存中完成数据流转,只在最后按需写入结果,对于10份文档的规模来说,内存占用完全可控,同时能把处理速度提升不少。
内容的提问来源于stack exchange,提问作者PN07815
相关产品推荐
相关产品推荐

