本文将详细解析一段用于从 PDF 文件中提取文本,对文本进行处理、词频统计,过滤排除词,排序输出结果并生成词云的 Python 代码。
python
import jieba
import fitz
from wordcloud import WordCloud
import matplotlib.pyplot as plt
jieba
:用于中文分词,将文本拆分成单个词语。fitz
:是 PyMuPDF 库的别名,用于读取 PDF 文件并提取文本。WordCloud
:用于生成词云图。matplotlib.pyplot
:用于展示生成的词云图。createWordCloud
python
def createWordCloud(items):
word_freq = {name: count for name, count in items}
font_path = 'simhei.ttf' # 按需修改字体路径
wc = WordCloud(
font_path=font_path,
background_color='white',
width=500,
height=300,
max_font_size=100,
margin=1,
relative_scaling=0.4,
scale=3,
prefer_horizontal=0.8
)
wordcloud = wc.generate_from_frequencies(word_freq)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
items
,每个元组包含词语和其对应的词频。items
转换为字典 word_freq
,键为词语,值为词频。WordCloud
对象 wc
,设置字体路径、背景颜色、宽度、高度等参数。generate_from_frequencies
方法根据词频生成词云图。matplotlib
展示词云图,同时关闭坐标轴显示。takeSecond
python
def takeSecond(elem):
return elem[1]
此函数用于返回元素的第二个值,在后续排序操作中作为排序的依据。
extract_text_from_pdf
python
def extract_text_from_pdf(path):
doc = fitz.open(path)
text = ""
for page in doc:
text += page.get_text()
return text
path
作为参数。fitz.open
打开 PDF 文件,得到一个文档对象 doc
。page.get_text
方法提取文本,并将其累加到字符串 text
中。process_text
python
def process_text(text):
words = jieba.lcut(text)
counts = {}
# 角色名称合并
role_mapping = {
"宝玉": ["二爷","绛洞花主", "富贵闲人"],
"黛玉": ["林姑娘", "颦儿", "林妹妹"],
"宝钗": ["宝姐姐", "宝姑娘", "蘅芜君"],
"熙凤": ["凤姐", "琏二奶奶", "凤辣子"],
"贾母": ["老祖宗", "史太君"],
"湘云": ["云妹妹", "枕霞旧友"]
}
# 使用字典推导式生成同义词映射
synonym_map = {alias: role for role, aliases in role_mapping.items() for alias in aliases}
for word in words:
if len(word) == 1:
continue
rword = synonym_map.get(word, word)
counts[rword] = counts.get(rword, 0) + 1
return counts
jieba.lcut
对输入的文本 text
进行分词,得到词语列表 words
。counts
用于存储词频。role_mapping
字典,用于将同义词映射到统一的名称。synonym_map
,键为同义词,值为统一名称。words
,过滤掉单个字符的词语。synonym_map
查找其统一名称 rword
,若不存在则使用原词。counts
字典中该词语的词频。filter_excluded_words
python
def filter_excluded_words(counts):
file = open("excludes.txt", "r", encoding='utf-8')
excludes = file.read().split(",")
file.close # 保持原始实现方式
for word in excludes:
if word in counts:
del counts[word]
counts
作为参数。excludes.txt
文件,读取其中的排除词,以中文逗号分割成列表 excludes
。excludes
列表,若某个排除词存在于 counts
字典中,则将其删除。sort_and_print_results
python
def sort_and_print_results(counts, top_n=36):
items = list(counts.items())
items.sort(key=takeSecond, reverse=True)
print("频率TOP{}词汇:".format(top_n))
for i in range(top_n):
item = items[i]
print("{0:<10}{1:>5}".format(item[0], item[1]))
return items[:top_n]
counts
和要输出的前 top_n
个词语(默认为 36)作为参数。counts
字典转换为元素为元组的列表 items
。sort
方法对 items
列表进行排序,排序依据为每个元组的第二个元素(词频),并按降序排列。top_n
个词语及其词频。top_n
个词语及其词频的列表。main
python
def main():
path = '红楼梦.pdf'
text = extract_text_from_pdf(path)
counts = process_text(text)
filter_excluded_words(counts)
top_items = sort_and_print_results(counts)
createWordCloud(top_items)
if __name__ == "__main__":
main()
path
。extract_text_from_pdf
函数提取 PDF 文本。process_text
函数对文本进行处理并统计词频。filter_excluded_words
函数过滤排除词。sort_and_print_results
函数排序并输出前 top_n
个词语及其词频。createWordCloud
函数生成并展示词云图。通过以上核心代码,我们可以从 PDF 文件中提取文本,进行一系列处理后生成词云图,直观地展示文本中高频词汇的分布情况。
最后输出:
频率TOP36词汇:
宝玉 4129
贾母 2278
熙凤 1150
王夫人 1016
黛玉 834
贾琏 679
宝钗 667
袭人 607
平儿 590
凤姐儿 436
薛姨妈 433
探春 424
鸳鸯 419
贾政 361
晴雯 331
湘云 331
贾珍 292
刘姥姥 278
紫鹃 278
邢夫人 267
香菱 265
尤氏 238
林黛玉 204
薛蟠 190
贾赦 184
周瑞家 162
贾蓉 151
贾芸 145
迎春 143
林之孝 138
雨村 136
大爷 130
赵姨娘 128
贾环 103
金桂 96
芳官 94
完整代码下载地址:https://download.csdn.net/download/u011321546/90705070