博文一:四大名著的自然语言处理实战教程
标题:用Python读懂四大名著:一个完整的NLP分析程序教程
一、项目背景与功能实现概述
自然语言处理(NLP)是人工智能中最有趣的方向之一。当我们把《红楼梦》的缠绵、《三国演义》的权谋、《水浒传》的豪迈、《西游记》的神话喂给计算机时,它能告诉我们什么?
本教程将带领大家完成一个综合性NLP分析程序,以四大名著为测试语料,通过Python实现从基础分词到高级可视化的全流程分析。
程序核心功能模块:
-
分词与清洗:将文本切分成词语颗粒度。
-
词频统计:找出书中出现最多的词。
-
词性标注与分类保存:自动识别名词、动词、形容词等,并分别存储。
-
人物/地名/武器专名识别:通过自定义词典精确提取特定实体。
-
数据可视化:生成饼状图、柱状图、关系图、词云。
-
自定义词典:解决“孙悟空”被分成“孙”和“悟空”的问题。
二、系统设计与技术选型
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正是打破这堵墙的攻城锤。
-
词频统计:排在高位的通常是“宝玉”、“黛玉”、“凤姐”、“贾母”等核心人物,以及“笑道”、“说道”等高频动作。
-
词性分类:
-
nr_words.txt:成功提取了“贾宝玉”、“林黛玉”、“薛宝钗”等。 -
ns_words.txt:提取了“大观园”、“怡红院”、“潇湘馆”等地名。
-
-
词云图:视觉上,“宝玉”字体最大,周围围绕着“黛玉”、“宝钗”、“老太太”等,直观展示了文本核心。
-
关系图:以宝玉为中心,辐射出黛玉、宝钗、袭人、王夫人等,边的粗细代表了他们在段落中“同框”的频率。
博文二:编辑器中的AI模型使用教程
标题:拥抱AI编程:在VSCode中接入DeepSeek等大模型(Continue插件实战)
一、引言
不知道你有没有遇到过这种情况:写代码卡壳了,需要切换到浏览器,打开ChatGPT,描述问题,复制答案,再切回编辑器粘贴。这个过程打断了编程的“心流”。
现在,AI模型被直接嵌入到了编辑器中,就像有一个随时在线的资深程序员坐在你旁边。本文将以目前最火的组合——VSCode + Continue插件 + DeepSeek模型为例,教你搭建属于自己的AI编程环境。
二、什么是“嵌入到编辑器中的AI”?
这类工具通常被称为AI辅助编程工具。它们不仅仅是简单的代码补全,而是能理解你的整个项目上下文,通过对话的方式直接在你的代码文件中生成、修改或解释代码。
常见的类似工具有:
-
GitHub Copilot:付费,基于OpenAI Codex,目前最流行。
-
Codeium:免费平替。
-
Cursor:独立的AI编辑器。
-
Continue:开源的VSCode插件,支持自定义接入各种模型(包括DeepSeek、ChatGLM、Llama等)。
-
安装 VSCode(Visual Studio Code)。
-
注册一个 DeepSeek 的API账号(或其他模型的API服务商,如OpenAI、硅基流动等),获取API Key。
-
打开VSCode,点击左侧活动栏的“扩展”图标(或按
Ctrl+Shift+X)。 -
在搜索框中输入“Continue”,点击安装 。
-
安装完成后,VSCode右侧边栏会出现Continue的图标。
-
点击图标打开Continue界面,它会提示你创建一个配置文件。
-
配置文件通常位于
~/.continue/config.json。 -
我们需要修改这个文件,告诉Continue使用DeepSeek的API接口。
-
在VSCode中新建一个Python文件。
-
按下
Ctrl+I调出Continue的内联模式。 -
输入:“用Python写一个快速排序算法”。
-
Continue会直接在你的光标处生成代码,你可以选择接受或修改。
-
选中一段你看不懂的复杂正则表达式。
-
按
Ctrl+L将选中代码发送到侧边栏对话框。 -
输入:“解释这段代码”。
-
AI会逐行分析这段代码的作用 。
-
选中一段有重复代码的函数。
-
在侧边栏输入:“重构这段代码,消除重复逻辑,遵循DRY原则”。
-
AI会给出重构建议,并可以一键应用到文件中。
-
效率提升:AI能帮你省去查文档、写样板代码的时间,让你更专注于核心业务逻辑和架构设计。
-
学习加速:当你遇到不懂的代码时,AI能像老师一样给你讲解,这是一种极其高效的学习方式。
-
保持批判:AI生成的代码并非100%正确。我们需要学会审查、测试和优化AI生成的代码。能把控AI的人,才会被AI赋能;不能把控AI的人,才会被AI淘汰。
-
自然语言理解(NLU):看懂文字。比如判断一条微博评论是“好评”还是“差评”。
-
自然语言生成(NLG):写出文字。比如根据天气数据自动生成一篇天气预报新闻。
-
输入法/语音助手:当你用讯飞输入法语音输入时,它背后的语音识别(ASR)和分词技术就在工作。当你对Siri说“设置明早8点的闹钟”,它需要意图识别和实体抽取(时间:明早8点,动作:设置闹钟)。
-
搜索引擎:在百度搜索“长城有多长”,搜索引擎不再只是返回包含关键词的网页,而是直接给出“21196.18公里”这个答案。这运用了问答系统和信息抽取技术。
-
电商推荐:淘宝和京东的“猜你喜欢”。当你经常搜索“机械键盘”,平台通过文本分类将你标记为“数码爱好者”,从而推荐相关内容。
-
机器翻译:浏览英文网页时,Chrome浏览器的一键翻译。从早期的逐词翻译,到现在基于Transformer架构的流畅翻译,质量已经大幅提升。
-
内容审核:在抖音、B站上传视频,弹幕和评论中如果有不文明用语,会被系统自动屏蔽或删除,这背后是敏感词过滤和文本分类。
-
医疗领域:辅助诊断与病历结构化
医生的问诊记录往往是长篇大论的描述性文字。NLP可以自动从病历中提取关键信息(主诉、现病史、既往史),形成结构化数据,辅助医生更快做出判断。甚至可以通过分析患者的描述,给出预诊断建议 。 -
法律领域:合同审查与类案推送
对于律师而言,审查一份几百页的合同需要耗费大量精力。NLP可以自动定位合同中的风险条款、缺失项。对于法官而言,输入当前案件的描述,系统可以自动推送历史上类似案件的判决结果,促进“同案同判” 。 -
教育领域:个性化学习与作文批改
未来的外语学习软件可能不再是简单的单词背诵,而是通过NLP技术与你进行自由对话,并根据你的语法错误进行针对性讲解。在作文批改上,AI不仅能检查错别字,还能分析文章的逻辑结构和情感色彩,给出像人类老师一样的评语。


被折叠的 条评论
为什么被折叠?



