400万条文本记录与1-2元语法词表的高效Python词频统计方案
高效处理百万级文本的1-gram/2-gram词频统计
现有一个包含约400万条文本段落的大型文件,以及一个包含约150个1-gram(一元语法)和2-gram(二元语法)术语的词表,需要开发高效的Python函数,为每条文本记录生成对应的词频统计字典(词表中未出现的术语记为0)。
以下是最小可复现示例代码:
import pandas as pd # 示例数据 # word_list包含一元语法和二元语法术语 word_list = ['apple', 'banana', 'dog', 'machine learning', 'data science', 'big data'] # 真实数据包含400万行,此处用5000次重复模拟大规模数据 texts = 5000 * [ 'I love apple and banana', 'The dog runs fast', 'machine learning is great', 'apple banana dog', 'data science and big data are related' ] # 将数据存储为DataFrame,包含'text'列 df = pd.DataFrame({'idx': range(len(texts)), 'text': texts}) # 需要实现高效函数,为每行文本返回词频统计字典 def count_words_in_texts(df, word_list): """ 返回每行文本的词频统计字典列表 df: 包含'text'列的DataFrame word_list: 术语/短语列表(含一元、二元语法) 返回值: 字典列表,每个字典对应一行文本的词频统计 """ # TODO: 实现高效词频统计逻辑 pass # 预期输出格式示例: # [{'apple': 1, 'banana': 1, 'dog': 0, 'machine learning': 0, 'data science': 0, 'big data': 0}, ...] results = count_words_in_texts(df, word_list) print(results)
高效实现方案
针对400万行的大规模数据,避免逐行循环匹配是提升效率的核心。以下利用正则预编译+Pandas向量化操作实现高效统计:
完整实现代码
import pandas as pd import re def count_words_in_texts(df, word_list): # 预编译正则表达式,确保匹配完整术语(避免部分匹配,比如"apple"不会匹配"apples") # 对每个术语单独处理,转义特殊字符并添加单词边界 regex_patterns = {term: re.compile(rf'\b{re.escape(term)}\b', flags=re.IGNORECASE) for term in word_list} # 用Pandas向量化方法批量统计每个术语的出现次数 count_df = pd.DataFrame() for term, pattern in regex_patterns.items(): count_df[term] = df['text'].str.count(pattern) # 将每行统计结果转换为字典,确保所有术语都存在(含次数为0的条目) return count_df.to_dict('records')
方案优势
- 预编译正则:避免重复编译正则表达式,减少计算开销
- 向量化操作:Pandas的
str.count是底层优化的向量化方法,比Python原生循环效率高几个数量级 - 精准匹配:通过
\b单词边界确保匹配完整术语,避免误统计(如不会把"apples"算作"apple") - 大小写兼容:添加
re.IGNORECASE标志适配不同大小写的文本场景,可根据需求移除
性能参考
针对示例中的25000行数据,该方法处理时间通常在1秒以内;对于400万行数据,普通服务器上的处理时间可控制在几分钟内(具体取决于硬件性能)。
可选优化方向
如果需要进一步提升性能,可以:
- 使用
swifter库自动选择最优的向量化/并行处理方式 - 提前对文本做预处理(统一大小写、去除特殊字符)
- 利用多进程并行处理(仅当硬件有大量空闲核心时收益明显)
内容的提问来源于stack exchange,提问作者statsman
相关产品推荐
相关产品推荐

