请求优化Python实现CSV文章标题词频统计的现有代码
优化后的简洁实现方案
嘿,你的代码已经能完美完成需求啦,但我们可以借助Pandas的矢量化特性和更Pythonic的写法,让它变得更简洁高效,可读性也更强。下面是优化后的版本,我会顺便拆解一下核心优化点:
优化后的代码
import pandas as pd # 读取数据 df = pd.read_csv("Article_titles.csv") print(df.head(10)) # 配置停用词(转成集合,查找效率更高)和特殊字符正则 stop_words = {"at","of","a","and","in","for","the","to","with","on","using","an","after","from","by","use","review","upper","new","system"} remove_chars_pattern = r"[.:,-%()[]?']" # 一步完成标题清洗、分词、过滤停用词 clean_word_series = ( df["Title"] .dropna() # 处理可能存在的空标题 .str.lower() .str.replace(remove_chars_pattern, "", regex=True) .str.split(expand=True) .stack() # 将所有拆分后的单词合并为一个一维序列 .loc[lambda word: word not in stop_words] ) # 统计词频并整理成目标格式 word_count_df = clean_word_series.value_counts().reset_index() word_count_df.columns = ["Keyword", "Count"] print(word_count_df.head(50))
主要优化点说明
- 替换循环为矢量化操作:原代码用
for循环逐个处理标题,Pandas的str系列方法可以批量处理整列数据,不仅速度更快,代码也更简洁。 - 停用词用集合存储:集合的成员查找是O(1)时间复杂度,比列表的O(n)快很多,尤其是当停用词数量较多时优势明显。
- 正则简化特殊字符移除:用正则表达式一次性匹配所有要移除的特殊字符,比
translate写法更直观易读,后续修改特殊字符列表也更方便。 - 用
stack()扁平化分词结果:拆分标题后会得到多列数据,stack()能把这些列的单词全部合并成一个一维序列,省去了手动拼接字符串的步骤。 - 直接用
value_counts()统计:Pandas内置的value_counts()可以直接统计序列中元素的出现次数,省去了手动调用Counter再转DataFrame的繁琐流程。
如果需要更进阶的处理(比如处理连字符单词、复数形式归一化等),还可以结合NLTK或SpaCy的分词工具,但针对你当前的需求,上面的代码已经足够简洁高效啦。
内容的提问来源于stack exchange,提问作者Jesper Mølgaard




