Python实战:四大名著NLP全解析

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

博文一:四大名著的自然语言处理实战教程

标题:用Python读懂四大名著:一个完整的NLP分析程序教程

一、项目背景与功能实现概述

自然语言处理(NLP)是人工智能中最有趣的方向之一。当我们把《红楼梦》的缠绵、《三国演义》的权谋、《水浒传》的豪迈、《西游记》的神话喂给计算机时,它能告诉我们什么?

本教程将带领大家完成一个综合性NLP分析程序,以四大名著为测试语料,通过Python实现从基础分词高级可视化的全流程分析。

程序核心功能模块:

  1. 分词与清洗:将文本切分成词语颗粒度。

  2. 词频统计:找出书中出现最多的词。

  3. 词性标注与分类保存:自动识别名词、动词、形容词等,并分别存储。

  4. 人物/地名/武器专名识别:通过自定义词典精确提取特定实体。

  5. 数据可视化:生成饼状图、柱状图、关系图、词云。

  6. 自定义词典:解决“孙悟空”被分成“孙”和“悟空”的问题。

二、系统设计与技术选型

1. 设计思想

采用模块化设计,将每一个独立功能封装为函数,在主程序中统一调度。这样做的优点是代码可维护性强,且方便日后添加新的分析功能(如情感分析)。程序采用函数+配置模式,所有文件路径和停用词表均在开头配置,便于移植。

2. 主要库与函数介绍
  • jieba:最好的Python中文分词库。

    • jieba.cut():精准模式分词。

    • jieba.load_userdict():加载自定义词典,解决专名分割错误。

  • collections:提供了Counter计数器,用于词频统计。

  • pandas:用于数据处理和展示。

  • matplotlib & pyplot:最底层的绘图库,用于生成饼状图和柱状图。

  • wordcloud:词云生成库。

  • networkx:用于绘制复杂网络关系图(如人物关系)。

三、完整代码实现

我们将代码分为三个部分:配置与工具函数核心分析函数主程序入口

python

import jieba
import jieba.posseg as pseg
import pandas as pd
import matplotlib.pyplot as plt
from collections import Counter
from wordcloud import WordCloud
import networkx as nx
import os

# ==================== 配置区域 ====================
STOPWORDS_PATH = 'stopwords.txt'  # 停用词表
USER_DICT_PATH = 'mydict.txt'      # 自定义词典
INPUT_FILE = 'hongloumeng.txt'     # 四大名著文本(以红楼梦为例)
OUTPUT_DIR = 'output/'              # 输出文件夹

# 创建输出目录
if not os.path.exists(OUTPUT_DIR):
    os.makedirs(OUTPUT_DIR)

# 加载停用词
def load_stopwords():
    stopwords = set()
    if os.path.exists(STOPWORDS_PATH):
        with open(STOPWORDS_PATH, 'r', encoding='utf-8') as f:
            for line in f:
                stopwords.add(line.strip())
    return stopwords

stopwords = load_stopwords()
# 加载自定义词典(如果有)
if os.path.exists(USER_DICT_PATH):
    jieba.load_userdict(USER_DICT_PATH)

# ==================== 核心功能函数 ====================

def read_text(filepath):
    """读取文本文件"""
    with open(filepath, 'r', encoding='utf-8') as f:
        text = f.read()
    return text

def word_segmentation(text):
    """分词功能,返回去除停用词后的词列表"""
    words = jieba.cut(text)
    filtered_words = [word for word in words if word not in stopwords and len(word.strip()) > 1 and not word.isdigit()]
    return filtered_words

def word_frequency(words, topN=50):
    """词频统计功能,返回前topN的词语"""
    counter = Counter(words)
    return counter.most_common(topN)

def save_pos_by_category(text):
    """词性分类保存txt功能:根据词性将词语写入不同文件"""
    words = pseg.cut(text)
    pos_dict = {
        'n': [], 'v': [], 'a': [],  # 名词、动词、形容词
        'nr': [], 'ns': [], 'nt': [] # 人名、地名、机构名
    }
    
    for word, flag in words:
        if len(word) < 2 or word in stopwords:
            continue
        if flag in pos_dict:
            pos_dict[flag].append(word)
        elif flag.startswith('n'): # 其他名词归入名词类
            pos_dict['n'].append(word)
    
    # 保存到文件
    for key, word_list in pos_dict.items():
        if word_list:
            with open(f'{OUTPUT_DIR}{key}_words.txt', 'w', encoding='utf-8') as f:
                f.write('\n'.join(set(word_list))) # 去重保存
    print("词性分类文件已保存至 output 目录。")

def extract_entities_by_dict(text, dict_path, output_filename):
    """利用自定义词典提取特定实体(人名/地名/武器)"""
    # 读取词典
    with open(dict_path, 'r', encoding='utf-8') as f:
        entity_dict = [line.strip() for line in f.readlines()]
    
    found_entities = []
    for entity in entity_dict:
        if entity in text:
            found_entities.append(entity)
    
    with open(f'{OUTPUT_DIR}{output_filename}', 'w', encoding='utf-8') as f:
        f.write('\n'.join(set(found_entities)))
    print(f"{output_filename} 已保存,共提取 {len(set(found_entities))} 个实体。")

# ==================== 可视化功能 ====================

def plot_pie_chart(word_freq_data, title="词频饼状图", filename="pie_chart.png"):
    """饼状图可视化"""
    words, counts = zip(*word_freq_data[:10]) # 取前10
    plt.figure(figsize=(8, 8))
    plt.pie(counts, labels=words, autopct='%1.1f%%', startangle=140)
    plt.title(title)
    plt.axis('equal')
    plt.savefig(f'{OUTPUT_DIR}{filename}')
    plt.show()

def plot_bar_chart(word_freq_data, title="词频柱状图", filename="bar_chart.png"):
    """柱状图可视化"""
    words, counts = zip(*word_freq_data[:15]) # 取前15
    plt.figure(figsize=(12, 6))
    plt.bar(words, counts, color='skyblue')
    plt.title(title)
    plt.xlabel('词语')
    plt.ylabel('出现次数')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig(f'{OUTPUT_DIR}{filename}')
    plt.show()

def generate_wordcloud(word_freq_data, title="词云图", filename="wordcloud.png"):
    """词云可视化功能"""
    # 将词频数据转为字典
    freq_dict = dict(word_freq_data)
    
    wordcloud = WordCloud(
        font_path='simhei.ttf', # 需指定中文字体
        width=800,
        height=600,
        background_color='white',
        max_words=100
    ).generate_from_frequencies(freq_dict)
    
    plt.figure(figsize=(10, 8))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')
    plt.title(title)
    plt.savefig(f'{OUTPUT_DIR}{filename}')
    plt.show()

def build_relation_graph(text, characters_list):
    """构建简单的人物关系图"""
    # 这里简化处理:如果两个人物在同一段落中出现,则认为有关联
    paragraphs = text.split('。') # 简单按句号分句
    G = nx.Graph()
    
    # 初始化节点
    G.add_nodes_from(characters_list[:15]) # 取前15个人物
    
    # 统计共现关系
    relation_matrix = {}
    for para in paragraphs:
        present_chars = [char for char in characters_list[:15] if char in para]
        for i in range(len(present_chars)):
            for j in range(i+1, len(present_chars)):
                pair = tuple(sorted([present_chars[i], present_chars[j]]))
                relation_matrix[pair] = relation_matrix.get(pair, 0) + 1
    
    # 添加边(权重为共现次数)
    for (char1, char2), weight in relation_matrix.items():
        if weight > 1: # 只显示共现超过1次的关系
            G.add_edge(char1, char2, weight=weight)
    
    # 绘制
    plt.figure(figsize=(12, 10))
    pos = nx.spring_layout(G, k=2)
    nx.draw(G, pos, with_labels=True, node_color='lightblue', 
            node_size=1000, font_size=10, font_family='SimHei')
    labels = nx.get_edge_attributes(G, 'weight')
    nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
    plt.title("人物共现关系图")
    plt.savefig(f'{OUTPUT_DIR}relation_graph.png')
    plt.show()

# ==================== 主程序 ====================
if __name__ == "__main__":
    print("正在读取《红楼梦》文本...")
    full_text = read_text(INPUT_FILE)
    
    print("1. 正在进行分词处理...")
    words = word_segmentation(full_text)
    
    print("2. 正在进行词频统计...")
    freq_data = word_frequency(words, topN=50)
    print("Top 10 词频:", freq_data[:10])
    
    print("3. 正在按词性分类保存...")
    save_pos_by_category(full_text)
    
    # 假设我们有自定义词典
    if os.path.exists('renwu_dict.txt'):
        print("4. 提取人名...")
        extract_entities_by_dict(full_text, 'renwu_dict.txt', 'renwu.txt')
    if os.path.exists('wuqi_dict.txt'):
        print("5. 提取武器名...")
        extract_entities_by_dict(full_text, 'wuqi_dict.txt', 'wuqi.txt')
    
    print("6. 生成可视化图表...")
    plot_pie_chart(freq_data)
    plot_bar_chart(freq_data)
    generate_wordcloud(freq_data)
    
    # 构建人物关系图(需要人名列表)
    if os.path.exists('renwu_dict.txt'):
        with open('renwu_dict.txt', 'r', encoding='utf-8') as f:
            renwu_list = [line.strip() for line in f.readlines()]
        build_relation_graph(full_text, renwu_list)
    
    print("所有任务执行完毕!")

四、测试数据与输出结果分析

测试数据:以《红楼梦》前八十回作为输入文本。

输出结果分析

三、实战:使用Continue插件接入DeepSeek

1. 环境准备

2. 安装Continue插件

3. 配置Continue(接入DeepSeek)

配置示例

json

{
  "models": [
    {
      "title": "DeepSeek Coder",
      "provider": "openai", // DeepSeek兼容OpenAI格式
      "model": "deepseek-coder",
      "apiKey": "YOUR_DEEPSEEK_API_KEY", // 在这里填入你的Key
      "apiBase": "https://api.deepseek.com/v1" // DeepSeek的官方API地址
    }
  ],
  "customCommands": [
    {
      "name": "test",
      "prompt": "编写这组函数的单元测试,使用 {{ ... }} 框架",
      "description": "单元测试生成"
    }
  ]
}

注:如果是通过“硅基流动”(SiliconFlow)等平台接入,只需要将 apiBase 改为平台的地址(如 https://api.siliconflow.cn/v1)并填写平台的API Key即可 。

四、使用场景演示

配置好后,你就可以开始体验AI编程了。

场景一:代码生成

场景二:代码解释

场景三:代码重构

五、对未来的思考:我能否运用?

答案是肯定的。作为一名(准)程序员,我们应当积极拥抱而非排斥这些新技术

博文三:我对自然语言处理的理解与应用展望

标题:让机器读懂人心:自然语言处理(NLP)的前世今生与未来

一、引言

每天早上,我对手机说“今天天气怎么样”,手机立刻给出回复;在购物网站上搜索“舒适的运动鞋”,结果出现的都是符合口味的商品;阅读英文论文时,浏览器一键翻译成流利的中文......

这些习以为常的场景背后,都有一项核心技术——自然语言处理(NLP)

二、什么是自然语言处理?

自然语言处理是人工智能的一个子领域,它的目标是让计算机能够理解、解释和生成人类语言。如果说编程语言是人和机器沟通的桥梁,那么NLP就是让机器主动学会说“人话”。

它主要包含两大方向:

三、我们身边的NLP技术应用实例

其实,NLP早已渗透到我们生活的方方面面:

四、未来,NLP会应用到哪些领域?

我有兴趣且看好的几个方向:

五、我的兴趣与展望

作为计算机专业的学生,我对NLP的兴趣源于它对“智能”的定义。在我看来,如果一个系统能通过图灵测试与人正常交流,那它无疑是智能的。

我对未来在NLP领域的探索充满期待,特别是多模态融合(结合文本、图像、声音共同理解世界)和小样本学习(让AI像人一样,通过极少量的例子就能学会一个新概念)。我相信,随着技术的不断进步,人与机器之间的界限将越来越模糊,而NLP正是打破这堵墙的攻城锤。


  1. 词频统计:排在高位的通常是“宝玉”、“黛玉”、“凤姐”、“贾母”等核心人物,以及“笑道”、“说道”等高频动作。

  2. 词性分类

    • nr_words.txt:成功提取了“贾宝玉”、“林黛玉”、“薛宝钗”等。

    • ns_words.txt:提取了“大观园”、“怡红院”、“潇湘馆”等地名。

  3. 词云图:视觉上,“宝玉”字体最大,周围围绕着“黛玉”、“宝钗”、“老太太”等,直观展示了文本核心。

  4. 关系图:以宝玉为中心,辐射出黛玉、宝钗、袭人、王夫人等,边的粗细代表了他们在段落中“同框”的频率。

    博文二:编辑器中的AI模型使用教程

    标题:拥抱AI编程:在VSCode中接入DeepSeek等大模型(Continue插件实战)

    一、引言

    不知道你有没有遇到过这种情况:写代码卡壳了,需要切换到浏览器,打开ChatGPT,描述问题,复制答案,再切回编辑器粘贴。这个过程打断了编程的“心流”。

    现在,AI模型被直接嵌入到了编辑器中,就像有一个随时在线的资深程序员坐在你旁边。本文将以目前最火的组合——VSCode + Continue插件 + DeepSeek模型为例,教你搭建属于自己的AI编程环境。

    二、什么是“嵌入到编辑器中的AI”?

    这类工具通常被称为AI辅助编程工具。它们不仅仅是简单的代码补全,而是能理解你的整个项目上下文,通过对话的方式直接在你的代码文件中生成、修改或解释代码。

    常见的类似工具有:

  5. GitHub Copilot:付费,基于OpenAI Codex,目前最流行。

  6. Codeium:免费平替。

  7. Cursor:独立的AI编辑器。

  8. Continue:开源的VSCode插件,支持自定义接入各种模型(包括DeepSeek、ChatGLM、Llama等)。

  9. 安装 VSCode(Visual Studio Code)。

  10. 注册一个 DeepSeek 的API账号(或其他模型的API服务商,如OpenAI、硅基流动等),获取API Key。

  11. 打开VSCode,点击左侧活动栏的“扩展”图标(或按 Ctrl+Shift+X)。

  12. 在搜索框中输入“Continue”,点击安装 。

  13. 安装完成后,VSCode右侧边栏会出现Continue的图标。

  14. 点击图标打开Continue界面,它会提示你创建一个配置文件。

  15. 配置文件通常位于 ~/.continue/config.json

  16. 我们需要修改这个文件,告诉Continue使用DeepSeek的API接口。

  17. 在VSCode中新建一个Python文件。

  18. 按下 Ctrl+I 调出Continue的内联模式。

  19. 输入:“用Python写一个快速排序算法”。

  20. Continue会直接在你的光标处生成代码,你可以选择接受或修改。

  21. 选中一段你看不懂的复杂正则表达式。

  22. 按 Ctrl+L 将选中代码发送到侧边栏对话框。

  23. 输入:“解释这段代码”。

  24. AI会逐行分析这段代码的作用 。

  25. 选中一段有重复代码的函数。

  26. 在侧边栏输入:“重构这段代码,消除重复逻辑,遵循DRY原则”。

  27. AI会给出重构建议,并可以一键应用到文件中。

  28. 效率提升:AI能帮你省去查文档、写样板代码的时间,让你更专注于核心业务逻辑和架构设计。

  29. 学习加速:当你遇到不懂的代码时,AI能像老师一样给你讲解,这是一种极其高效的学习方式。

  30. 保持批判:AI生成的代码并非100%正确。我们需要学会审查、测试和优化AI生成的代码。能把控AI的人,才会被AI赋能;不能把控AI的人,才会被AI淘汰。

  31. 自然语言理解(NLU):看懂文字。比如判断一条微博评论是“好评”还是“差评”。

  32. 自然语言生成(NLG):写出文字。比如根据天气数据自动生成一篇天气预报新闻。

  33. 输入法/语音助手:当你用讯飞输入法语音输入时,它背后的语音识别(ASR)分词技术就在工作。当你对Siri说“设置明早8点的闹钟”,它需要意图识别实体抽取(时间:明早8点,动作:设置闹钟)。

  34. 搜索引擎:在百度搜索“长城有多长”,搜索引擎不再只是返回包含关键词的网页,而是直接给出“21196.18公里”这个答案。这运用了问答系统信息抽取技术。

  35. 电商推荐:淘宝和京东的“猜你喜欢”。当你经常搜索“机械键盘”,平台通过文本分类将你标记为“数码爱好者”,从而推荐相关内容。

  36. 机器翻译:浏览英文网页时,Chrome浏览器的一键翻译。从早期的逐词翻译,到现在基于Transformer架构的流畅翻译,质量已经大幅提升。

  37. 内容审核:在抖音、B站上传视频,弹幕和评论中如果有不文明用语,会被系统自动屏蔽或删除,这背后是敏感词过滤文本分类

  38. 医疗领域:辅助诊断与病历结构化
    医生的问诊记录往往是长篇大论的描述性文字。NLP可以自动从病历中提取关键信息(主诉、现病史、既往史),形成结构化数据,辅助医生更快做出判断。甚至可以通过分析患者的描述,给出预诊断建议 。

  39. 法律领域:合同审查与类案推送
    对于律师而言,审查一份几百页的合同需要耗费大量精力。NLP可以自动定位合同中的风险条款、缺失项。对于法官而言,输入当前案件的描述,系统可以自动推送历史上类似案件的判决结果,促进“同案同判” 。

  40. 教育领域:个性化学习与作文批改
    未来的外语学习软件可能不再是简单的单词背诵,而是通过NLP技术与你进行自由对话,并根据你的语法错误进行针对性讲解。在作文批改上,AI不仅能检查错别字,还能分析文章的逻辑结构和情感色彩,给出像人类老师一样的评语。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值