一、程序功能

 

1. 文本分词与自定义词典管理:实现对文本的分词操作,并支持加载自定义词典以优化分词效果。

2. 词频统计分析及可视化(饼图/柱状图):统计文本中词语出现的频率,并通过饼图和柱状图进行可视化展示。

3. 词性标注与分类存储:对文本中的词语进行词性标注,并将标注结果分类存储。

4. 命名实体识别(人名/地名/武器):识别文本中的人名、地名和武器等实体信息。

5. 词云可视化:根据文本词频生成词云图,直观展示文本中重要词汇。

 

二、设计思想

 

1. 模块化设计:将每个功能封装为独立函数,提高代码的可维护性和复用性。

2. 面向对象与函数式编程结合:在实现过程中综合运用两种编程范式,以达到简洁高效的代码结构。

3. 可视化结果自动存储机制:将生成的可视化图表自动保存到指定路径。

4. 支持中文文本处理:主要针对中文文本进行自然语言处理操作。

 

三、核心库与函数

 

 

 

四、代码实现

 

import jieba

import jieba.posseg as pseg

from collections import Counter

from wordcloud import WordCloud

import matplotlib.pyplot as plt

def load_custom_dict(filepath):

    """加载自定义词典"""

    try:

        with jieba.open(filepath, 'r', encoding='utf - 8') as f:

            for line in f:

                word, _, _ = line.strip().split(' ')

                jieba.add_word(word)

    except FileNotFoundError:

        pass

def tokenize_text(text, use_stopwords=True):

    """文本分词处理"""

    words = jieba.lcut(text)

    if use_stopwords:

        try:

            with jieba.open('data/stopwords.txt', 'r', encoding='utf - 8') as f:

                stopwords = set(f.read().split())

            return [w for w in words if w not in stopwords and len(w) > 1]

        except FileNotFoundError:

            return words

    return words

def analyze_pos(text, save_path='output/pos_analysis.txt'):

    """词性标注与分析"""

    pos_result = pseg.cut(text)

    pos_dict = {}

    for w, p in pos_result:

        pos_dict.setdefault(p, []).append(w)

    try:

        with jieba.open(save_path, 'w', encoding='utf - 8') as f:

            for p, words in pos_dict.items():

                f.write(f"{p}: {len(words)}\n")

    except FileNotFoundError:

        pass

    return pos_dict

def generate_wordcloud(word_freq, save_path='output/wordcloud.png'):

    """生成词云图"""

    wc = WordCloud(

        font_path='data/simhei.ttf',

        background_color='white',

        max_words=200

    ).generate_from_frequencies(word_freq)

    plt.figure(figsize=(15, 10))

    plt.imshow(wc)

    plt.axis('off')

    plt.savefig(save_path)

    plt.close()

def visualize_word_frequency_pie(word_freq, save_path='output/freq_pie.png'):

    """绘制词频统计饼图"""

    labels = [word for word, _ in word_freq]

    sizes = [freq for _, freq in word_freq]

    plt.figure(figsize=(8, 8))

    plt.pie(sizes, labels=labels, autopct='%1.1f%%')

    plt.axis('equal')

    plt.savefig(save_path)

    plt.close()

def visualize_word_frequency_bar(word_freq, save_path='output/freq_bar.png'):

    """绘制词频统计柱状图"""

    x = [word for word, _ in word_freq]

    y = [freq for _, freq in word_freq]

    plt.figure(figsize=(12, 6))

    plt.bar(x, y)

    plt.xticks(rotation=45)

    plt.xlabel('Words')

    plt.ylabel('Frequency')

    plt.tight_layout()

    plt.savefig(save_path)

    plt.close()

# 其他功能函数(实体识别等)

if __name__ == "__main__":

    initialize_environment()

    load_custom_dict('data/custom_dict.txt')

    try:

        with jieba.open('data/sample.txt', 'r', encoding='utf - 8') as f:

            text = f.read()

    except FileNotFoundError:

        text = ""

    words = tokenize_text(text)

    word_freq = Counter(words).most_common(50)

    analyze_pos(text)

    generate_wordcloud(dict(word_freq))

    visualize_word_frequency_pie(word_freq)

    visualize_word_frequency_bar(word_freq)

 

 

五、测试数据

 

测试文本(data/sample.txt):

 

三国演义选段:却说曹操引军自南阳进发,关羽提青龙偃月刀率军迎战。两军会于博望坡,张飞持丈八蛇矛且说曹操当日对何进曰:“宦官之祸,古今皆有;但世主不当假之权宠,使至于此。若欲治罪,当除元恶,但付一狱吏足矣,何必纷纷召外兵乎?欲尽诛之,事必宣露。吾料其必败也。”何进怒曰:“孟德亦怀私意耶?”操退曰:“乱天下者,必进也。”进乃暗差使命,赍密诏星夜往各镇去。
  却说前将军、鳌乡侯、西凉刺史董卓,先为破黄巾无功,朝议将治其罪,因贿赂十常侍幸免;后又结托朝贵,遂任显官,统西州大军二十万,常有不臣之心。是时得诏大喜,点起军马,陆续便行;使其婿中郎将牛辅;守住陕西,自己却带李傕、郭汜、张济、樊稠等提兵望洛阳进发。
  卓婿谋士李儒曰:“今虽奉诏,中间多有暗味。何不差人上表,名正言顺,大事可图。”卓大喜,遂上表。其略曰:“窃闻天下所以乱逆不止者,皆由黄门常侍张让等侮慢天常之故。臣闻扬汤止沸,不如去薪;溃痈虽痛,胜于养毒。臣敢鸣钟鼓入洛阳,请除让等。社稷幸甚!天下幸甚!”何进得表,出示大臣。侍御史郑泰谏曰:“董卓乃豺狼也,引入京城,必食人矣。”进曰:“汝多疑,不足谋大事。”卢植亦谏曰:“植素知董卓为人,面善心狠;一入禁庭,必生祸患。不如止之勿来,免致生乱。”进不听,郑泰、卢植皆弃官而去。朝廷大臣,去者大半。进使人迎董卓于渑池,卓按兵不动。
  张让等知外兵到,共议曰:“此何进之谋也;我等不先下手,皆灭族矣。”乃先伏刀斧手五十人于长乐宫嘉德门内,入告何太后曰:“今大将军矫诏召外兵至京师,欲灭臣等,望娘娘垂怜赐救。”太后曰:“汝等可诣大将军府谢罪。”让曰:“若到相府,骨肉齑粉矣。望娘娘宣大将军入宫谕止之。如其不从,臣等只就娘娘前请死。”太后乃降诏宣进。
  进得诏便行。主簿陈琳谏曰:“太后此诏,必是十常侍之谋,切不可去。去必有祸。”进曰:“太后诏我,有何祸事?”袁绍曰:“今谋已泄,事已露,将军尚欲入宫耶?”曹操曰:“先召十常侍出,然后可入。”进笑曰:“此小儿之见也。吾掌天下之权,十常侍敢待如何?”绍曰:“公必欲去,我等引甲士护从,以防不测。”于是袁绍、曹操各选精兵五百,命袁绍之弟袁术领之。袁术全身披挂,引兵布列青琐门外。绍与操带剑护送何进至长乐宫前。黄门传懿旨云:“太后特宣大将军,余人不许辄入。”将袁绍、曹操等都阻住宫门外。
  何进昂然直入。至嘉德殿门,张让、段珪迎出,左右围住,进大惊。让厉声责进曰:“董后何罪,妄以鸩死?国母丧葬,托疾不出!汝本屠沽小辈,我等荐之天子,以致荣贵;不思报效,欲相谋害,汝言我等甚浊,其清者是谁?”进慌急,欲寻出路,宫门尽闭,伏甲齐出,将何进砍为两段。后人有诗叹之曰;“汉室倾危天数终,无谋何进作三公。几番不听忠臣谏,难免宫中受剑锋。”

 

六、输出结果

 

1. 文本分析结果:

 

- output/pos_analysis.txt

- output/person_names.txt

- output/locations.txt

 

2. 可视化文件:

 

- output/wordcloud.png

- output/freq_pie.png

- output/freq_bar.png

 

七、设计分析

 

1. 模块化设计便于功能扩展:每个功能独立成函数,后续可方便地对特定功能进行修改或添加新功能。

2. 可视化采用matplotlib库实现基础图表绘制:利用matplotlib库绘制饼图、柱状图,简单直观展示词频信息。

3. 自定义词典机制提升专业领域分词效果:通过加载自定义词典,可使分词更符合特定领域需求。

 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐