"""
完整流程:读取英文 txt 文件 -> 清洗分词 -> 统计词频 -> 生成词云(字频越高字越大)
"""
import re
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from collections import Counter
# ================= 1. 读取文本 =================
file_path = r"d:\ipy\Harvard Business Review The Essential Guide to Leadership.txt"
try:
with open(file_path, "r", encoding="utf-8") as f:
text = f.read()
print(f"成功读取文件,总字符数:{len(text)}")
except FileNotFoundError:
print(f"错误:找不到文件 {file_path}")
exit()
except Exception as e:
print(f"读取文件时发生错误:{e}")
exit()
# ================= 2. 英文文本清洗与分词 =================
# 2.1 统一转换为小写,确保 The 和 the 被统计为同一个词
text = text.lower()
# 2.2 使用正则表达式提取所有英文单词,自动剥离标点符号
# \b 表示单词边界,[a-z]+ 匹配一个或多个连续的小写字母
# 这样 "woods," 会被提取为 "woods","don't" 会被提取为 "don" 和 "t"
words_list = re.findall(r'\b[a-z]+\b', text)
# ================= 3. 词频统计与停用词过滤 =================
# 定义英文停用词表(常见的虚词、代词等,即使频率高也不应出现在词云中)
stop_words = {
"the", "and", "of", "to", "a", "in", "is", "it", "you", "that", "he",
"was", "for", "on", "are", "with", "as", "i", "his", "they", "be",
"at", "one", "have", "this", "from", "or", "had", "by", "not", "but",
"what", "all", "were", "we", "when", "your", "can", "said", "there",
"more", "who", "most", "her", "harvard", "would",
"an", "each", "which", "she", "do", "how", "their", "if", "will", "up",
"other", "about", "out", "many", "then", "them", "these", "so", "some"
}
# 过滤掉长度小于3的词(如 is, a, of)以及停用词
# 英文中长度小于3的词绝大多数是无意义的,这样代码更健壮,即使停用词表不全也能过滤掉大部分虚词
filtered_words = [word for word in words_list if len(word) >= 3 and word not in stop_words]
# 使用 Counter 统计词频
word_counts = Counter(filtered_words)
# 打印频率最高的前10个词,验证统计结果
print("\n--- 词频统计 Top 10 ---")
for word, count in word_counts.most_common(10):
print(f"'{word}': {count}次")
# ================= 4. 生成词云 =================
print("\n正在生成词云...")
wc = WordCloud(
background_color="white",
width=1000,
height=600,
max_words=150, # 最多显示的词数
colormap="Set2", # 英文词云用 Set2 或 viridis 配色很好看
prefer_horizontal=0.7,
contour_width=2, # 可选:添加边缘轮廓
contour_color="steelblue"
)
# 核心步骤:直接传入词频字典生成词云
wc.generate_from_frequencies(word_counts)
# ================= 5. 显示与保存 =================
plt.figure(figsize=(12, 7), dpi=100)
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.show()
# 保存到原文件同目录下
save_path = r"d:\ipy\Woods_wordcloud.png"
wc.to_file(save_path)
print(f"词云已保存至:{save_path}")这段Python代码实现了一个非常经典且实用的自然语言处理(NLP)基础任务:**从英文文本中提取关键词并生成可视化词云**。
下面我将从整体用途、实现原理、代码步骤拆解以及注意事项四个方面为你详细解释这段代码。
---
### 一、 代码用途
这段代码的主要功能是:读取一本英文书籍/文章(TXT格式),对文本进行清洗和分词,统计单词出现的频率,过滤掉无意义的虚词(停用词),最后根据词频生成一张词云图,词频越高的单词在图片中显示得越大,并保存到本地。
---
### 二、 实现原理与步骤拆解
代码逻辑清晰,分为5个核心步骤:
#### 1. 读取文本
* 原理:使用Python内置的 open() 函数以UTF-8编码读取文本文件。
* 亮点:使用了 try-except 块来捕获 FileNotFoundError 和其他异常,这是一种良好的防御性编程习惯,避免因文件路径错误导致程序崩溃。
#### 2. 英文文本清洗与分词
* 原理:
* text.lower():将全文转为小写。这是NLP中的标准操作,因为英文中 "The" 和 "the" 是同一个词,如果不转小写,会被统计为两个不同的词。
* re.findall(r'\b[a-z]+\b', text):使用正则表达式提取单词\b 代表单词边界[a-z]+ 匹配一个或多个连续的小写字母。这样可以直接剥离掉逗号、句号等标点符号。
#### 3. 词频统计与停用词过滤
* 原理:
* 停用词过滤:代码定义了一个 stop_words 集合,包含了 "the", "and", "is" 等高频但无实际意义的虚词。集合的查找时间复杂度是 O(1),比列表更适合做过滤。
* 长度过滤len(word) >= 3,过滤掉 "a", "an", "is" 等短词,作为停用词表的补充,非常实用。
* 词频统计:使用 collections.Counter 对过滤后的词表进行统计,它底层基于字典,专门用于计算哈希表(如字符串)的出现次数,并提供了便捷的 most_common() 方法。
#### 4. 生成词云
* 原理:使用 wordcloud 库。该库的核心算法是根据输入的词频字典,计算每个词的占比,然后在二维空间中进行**布局算法**(通常是随机放置后检测碰撞并调整位置),将文字填充进画布中。
* 参数解析:
* max_words=150:限制词云中最多显示150个词,避免过于拥挤。
* prefer_horizontal=0.7:70%的词水平排列,30%垂直排列,增加视觉美感。
* generate_from_frequencies():这是 WordCloud 的核心方法之一,允许直接传入 Counter 生成的词频字典,而不是原始文本。
#### 5. 显示与保存
* 原理:使用 matplotlib.pyplot 将词云对象渲染为图像并展示plt.show()),同时使用 WordCloud 自带的 to_file() 方法将图片保存为PNG格式。
---
### 三、 注意事项与优化建议
虽然这段代码已经非常规范,但在实际使用中需要注意以下几点:
1. 正则表达式的局限性:
* 当前正则 \b[a-z]+\b 会将带有撇号的词强行拆分,例如 "don't" 会被提取为 "don" 和 "t""it's" 会变成 "it" 和 "s"。
* 优化建议:如果需要保留缩写,可以将正则修改为 r"\b[a-z']+\b",允许单词中包含撇号。
2. 停用词表需要根据场景定制:
代码中把 "harvard" 加入了停用词,这是因为文本来源是《哈佛商业评论》,"harvard" 出现极多但对理解文章主题无帮助。这提示我们:*停用词表没有银弹,必须根据具体文本内容动态调整**。
3. 中文字符支持问题:
如果未来你想把这段代码用于中文文本,*直接运行会显示为方块(乱码)**。因为 WordCloud 默认的字体不支持中文。
* 解决方案:在 WordCloud() 初始化时,必须指定中文字体路径,例如font_path=r"C:\Windows\Fonts\simhei.ttf"(黑体),同时分词方式也需要从正则替换为 jieba 等中文分词库。
4. 文件路径的跨平台兼容性:
* 代码中使用了 r"d:\ipy\..." 这种硬编码的Windows绝对路径。如果在Mac或Linux上运行会报错。
* 优化建议:推荐使用 os.path.join 或 pathlib 库来构建路径,或者将文件放在代码同目录下使用相对路径。
5. 依赖库安装:
* 运行此代码需要提前安装第三方库,部分新手可能会漏装。请在命令行执行:
pip install wordcloud matplotlib
总结来说,这是一段结构完整、注释清晰、具备容错处理的优秀数据分析入门代码,完美展示了文本处理“读取-清洗-统计-可视化”的标准范式。
--- 词频统计 Top 10 ---
'business': 214次
'work': 196次
'team': 193次
'people': 179次
'time': 127次
'review': 122次
'leaders': 118次
'company': 117次
'managers': 113次
'leadership': 110次