当前位置: 首页 > news >正文

自然语言处理期末复习

自然语言处理期末复习

一单元 自然语言处理基础

  • 两个核心任务:
    • 自然语言理解(NLU, Natural Language Understanding)
      让计算机“读懂”人类语言,理解文本的语义、结构和意图。
      • 典型子任务包括:分词、词性标注、句法分析、语义角色标注、指代消解、情感分析、命名实体识别、文本分类等。
      • 目标是让机器能够像人一样理解文本内容、推断上下文、识别实体和关系。
      • 应用举例:智能问答、自动摘要、舆情分析、法律文档理解等。
    • 自然语言生成(NLG, Natural Language Generation)
      让计算机“写作”或“说话”,自动生成符合人类表达习惯的自然语言文本。
      • 典型子任务包括:自动摘要、机器翻译、对话生成、文本续写、报告生成等。
      • 目标是让机器能够根据输入(结构化数据、知识图谱、摘要、关键词等)生成流畅、连贯、符合语境的自然语言文本。
      • 应用举例:新闻自动撰写、智能客服回复、AI写作助手、数据报告生成等

  • 经典应用:

    • 机器翻译
      自动将一种自然语言的文本转换为另一种语言。
      • 典型系统:Google Translate、百度翻译、DeepL。
      • 技术演进:从基于规则、统计机器翻译(SMT)到神经机器翻译(NMT,基于Seq2Seq/Transformer/BERT等)。
    • 问答系统
      根据用户输入的问题,自动检索或生成准确答案。
      • 包括开放域问答(如百度知道、Quora)、闭域问答(如医疗、法律等专业领域)、阅读理解(如SQuAD数据集)。
      • 技术:信息检索、知识图谱、深度学习、生成式大模型。
    • 对话系统
      与用户进行多轮自然语言交互,实现智能客服、虚拟助手等功能。
      • 分为任务型对话(如订票、点餐)、闲聊型对话(如小冰、ChatGPT)、混合型对话。
      • 技术:意图识别、对话管理、上下文建模、生成式模型。
    • 文本摘要
      自动生成文本的简要内容,分为抽取式摘要和生成式摘要。
      • 应用:新闻摘要、学术论文摘要、会议纪要等。
      • 技术:TextRank、Seq2Seq、Transformer、BART等。
    • 文本分类
      将文本自动归入预定义的类别。
      • 应用:垃圾邮件识别、新闻分类、情感极性分类、法律文书归档等。
      • 技术:朴素贝叶斯、SVM、深度学习、BERT等。
    • 情感分析
      判断文本的主观情感倾向(如正面、负面、中性)。
      • 应用:产品评论分析、舆情监控、用户满意度调查等。
      • 技术:情感词典、机器学习、深度学习、预训练模型。
    • 舆论分析
      对大规模社交媒体、新闻等文本进行自动化分析,挖掘热点话题、观点倾向、事件演化等。
      • 应用:政府舆情监控、品牌危机预警、市场调研等。
      • 技术:主题建模、情感分析、事件抽取、网络传播建模。
    • 知识图谱
      从文本中自动抽取实体、属性和关系,构建结构化的知识网络。
      • 应用:智能搜索、推荐系统、问答系统、企业知识管理等。
      • 技术:实体识别、关系抽取、三元组存储、图数据库、推理算法。
  • 三个层面:

在这里插入图片描述

  • 词法分析问题:
    • 词的定义和生词问题
      • 词的定义:在中文中,词与词之间没有天然的分隔符,如何界定“词”的边界是分词的基础。例如,“研究生物”可以分为“研究/生物”或“研究生/物”。
      • 生词问题:语料库中未出现过的新词(如网络热词、专有名词等)难以被词典或统计模型正确识别,导致分词错误或遗漏。
      • 解决方法:结合词典、统计方法(如基于互信息、左右熵的新词发现)、人工标注等。
    • 分词歧义问题
      • 同一个句子可能有多种合法的分词方式,需根据上下文选择最合适的切分。例如,“南京市长江大桥”可分为“南京市/长江大桥”或“南京/市长/江大桥”。
      • 歧义类型包括:组合歧义(如“研究生活”)、重叠歧义(如“长春市长春节讲话”)。
      • 解决方法:基于词频、概率统计、最大匹配、隐马尔可夫模型(HMM)、条件随机场(CRF)等方法进行消歧。
    • 词性定义和词性兼类问题
      • 词性定义:同一个词在不同语境下可能有不同的词性(如“打”可以是动词,也可以是名词)。
      • 词性兼类:一个词具有多种词性,需要根据上下文判别其实际词性。
      • 解决方法:基于规则、统计、机器学习的词性标注算法(如HMM、CRF、深度学习模型)。

  • 句法分析问题:
    • 模型定义问题
      • 选择何种句法分析模型(如短语结构文法、依存文法、转换文法等),不同模型适用于不同语言和任务。
      • 例如,英文常用短语结构文法(CFG/PCFG),中文常用依存文法。
    • 特征表示问题
      • 如何将句子的结构、词性、词序等信息转化为模型可用的特征。
      • 传统方法依赖人工设计特征(如词性、上下文窗口、依存关系等),现代方法多用神经网络自动学习特征。
    • 解码问题
      • 给定模型和特征,如何高效地从所有可能的句法结构中找到最优结构。
      • 常用算法有CKY算法(用于PCFG)、贪心算法、动态规划、图算法等。
    • 训练算法问题
      • 如何利用标注语料训练句法分析模型,包括参数估计、结构学习等。
      • 传统方法有最大似然估计、EM算法,现代方法有神经网络端到端训练、迁移学习等。

二单元 中文分词

在这里插入图片描述

  • 中文分词工具包jieba结合了基于规则基于统计这两种方法
  • jieba的三种分词方式:
    • 精确模式:将句子精确的分开,适合文本分析
    • 全模式:将句子中所有的词都扫描出来,但不能解决歧义
    • 搜索引擎模式:在精确模式下,对长词进行再次切分,提高召回率,适合用于搜索引擎分词,同时也支持自定义字典
  • 示例:

1.精确分词模式:

import jieba
words = jieba.cut("南京市长江大桥")
print(words)
print("/".join(words))南京市/长江大桥

2.全模式分词

words = jieba.cut("南京市长江大桥",cut_all = True)
print(words)
print("/".join(words))南京/南京市/京市/市长/长江/长江大桥/大桥
words = jieba.lcut("南京市长江大桥",cut_all = True)
print(words)words = jieba.lcut("南京市长江大桥",cut_all = True)
print(words)import jieba# 待分词的文本
text = "南京市长江大桥"# 全模式分词:输出所有可能的分词结果
words_full = jieba.lcut(text, cut_all=True)
print("全模式分词结果:", words_full)# 精确模式分词:尝试最精确的分词,适合文本分析
words_precise = jieba.lcut(text, cut_all=False)
print("精确模式分词结果:", words_precise)# 搜索引擎模式分词:在精确模式基础上,对长词再次切分
words_search = jieba.lcut_for_search(text)
print("搜索引擎模式分词结果:", words_search)全模式分词结果: ['南京', '南京市', '京市', '市长', '长江', '长江大桥', '江大', '大桥']
精确模式分词结果: ['南京市', '长江大桥']
搜索引擎模式分词结果: ['南京', '京市', '南京市', '长江', '大桥', '长江大桥']

3.搜索引擎模式

words = jieba.cut_for_search("南京市长江大桥")
print(words)
print("/".join(words))南京/京市/南京市/长江/大桥/长江大桥
words = jieba.lcut_for_search("南京市长江大桥")
print(words)
print("/".join(words))['南京', '京市', '南京市', '长江', '大桥', '长江大桥']
南京/京市/南京市/长江/大桥/长江大桥

三单元 词性标注和命名实体识别

  • 词性标注
    词性标注(Part-of-Speech Tagging, POS Tagging)是指给定一个句子,判定每个词的语法范畴(如名词、动词、形容词等),并进行标注。

    • 意义:为后续的句法分析、语义分析等任务提供基础信息。
    • 常见方法:基于规则、统计(如隐马尔可夫模型HMM、条件随机场CRF)、深度学习(如BiLSTM-CRF)。
    • 难点:同一个词在不同上下文中可能有不同词性(如“打”既可作动词,也可作名词),需要结合上下文判别。
  • 命名实体识别(NER)
    命名实体识别(Named Entity Recognition, NER)旨在识别文本中具有特定意义的实体,如人名、地名、组织机构名、时间、数字等。

    • 意义:为信息抽取、知识图谱构建、问答系统等提供实体基础。
    • 常见方法:基于规则、统计学习(如HMM、CRF)、深度学习(如BiLSTM-CRF、BERT+CRF)。
    • 难点:实体边界识别、实体类型判别、多义实体消歧。
  • LTP命名实体识别模型(NamedEntityRecognizer)
    LTP(Language Technology Platform)是哈工大社会计算与信息检索研究中心开发的中文自然语言处理工具包,其命名实体识别模型支持以下实体类别:

    • 人名(Nh):如“李白”、“马云”

    • 地名(Ns):如“北京”、“长江大桥”

    • 机构名(Ni):如“清华大学”、“阿里巴巴”

    • 标注体系:LTP采用BIESO标注体系

      • B(Begin):实体的开始
      • I(Inside):实体的中间
      • E(End):实体的结束
      • S(Single):单独成实体
      • O(Other):非实体
  • 应用举例

    • 句子:“马云是阿里巴巴的创始人。”
      • 词性标注结果:马云/nr 是/v 阿里巴巴/nt 的/ude1 创始人/n 。
      • 命名实体识别结果:马云/S-Nh 是/O 阿里巴巴/S-Ni 的/O 创始人/O 。
  • 常用工具与库

    • 中文:LTP、HanLP、jieba(支持简单词性标注)、pkuseg
    • 英文:NLTK、spaCy、Stanza

利用pyltp词性标注

from pyltp import Postagger
postagger = Postagger("ltp_model\pos.model") #模型初始化
postags = postagger.postag(words)   #词性标注
for word,postag in zip(words,postags):print(word,postag,end = "\\")我 r\愿意 v\把 p\我 r\生命 n\的 u\三分之一 m\from pyltp import Postagger# 初始化词性标注器,加载预训练模型
# 请确保模型文件pos.model存在于指定路径下
postagger = Postagger()  
postagger.load("ltp_model/pos.model")  # 加载词性标注模型# 待标注的词语列表
# 此处words变量未定义,需要在使用前赋值
# 例如: words = ["我", "愿意", "把", "我", "生命", "的", "三分之一"]
words = []  # 执行词性标注,返回每个词语对应的词性标签
postags = postagger.postag(words)  # 遍历词语和对应的词性标签并打印
# 格式为:词语 词性\词语 词性\...
for word, postag in zip(words, postags):print(word, postag, end="\\")# 使用完毕后释放模型资源
postagger.release()  

利用pyltp命名实体识别

from pyltp import NamedEntityRecognizer
recognizer = NamedEntityRecognizer("ltp_model\ner.model") #模型初始化
netags = recognizer.recognize(words,postags) #命名实体识别
for word,netag in zip(words,netags)print(word,netag,end = "\\")from pyltp import NamedEntityRecognizer# 初始化命名实体识别器,加载预训练模型
# 请确保模型文件ner.model存在于指定路径下
recognizer = NamedEntityRecognizer()
recognizer.load("ltp_model/ner.model")  # 加载命名实体识别模型# 待识别的词语列表和对应的词性标签
# 此处words和postags变量未定义,需要在使用前赋值
# 例如: 
# words = ["张三", "在", "北京大学", "读书"]
# postags = ["nh", "p", "ni", "v"]
words = []
postags = []# 执行命名实体识别,返回每个词语对应的实体标签
# 输入:分词结果和词性标注结果
# 输出:命名实体标签列表
netags = recognizer.recognize(words, postags)# 遍历词语和对应的实体标签并打印
# 格式为:词语 实体标签\词语 实体标签\...
for word, netag in zip(words, netags):print(word, netag, end="\\")# 使用完毕后释放模型资源
recognizer.release()words = ["张三", "在", "北京大学", "读书"]
postags = ["nh", "p", "ni", "v"]
netags = recognizer.recognize(words, postags)
# 可能的输出:
# 张三 S-Nh\在 O\北京大学 S-Ni\读书 O\

利用pyltp依存语法分析

#加载依存语法分析模型
from pyltp import Parser
parser= Parser("ltp_model\parser.model") #模型初始化arcs = parser.parse(words,postags) #依存句法分析
print(arcs)
print("依存句法分析:",'\t'.join("%d:%s"%(arc[0],arc[1]) for arc in arcs))[(2, 'SBV'), (0, 'HED'), (2, 'VOB'), (5, 'ATT'), (7, 'ATT'), (5, 'RAD'), (3, 'VOB')]
依存句法分析: 2:SBV	0:HED	2:VOB	5:ATT	7:ATT	5:RAD	3:VOB# 加载依存语法分析模型
from pyltp import Parser# 初始化依存句法分析器,加载预训练模型
# 请确保模型文件parser.model存在于指定路径下
parser = Parser()
parser.load("ltp_model/parser.model")  # 加载依存句法分析模型# 待分析的词语列表和对应的词性标签
# 此处words和postags变量未定义,需要在使用前赋值
# 例如: 
# words = ["我", "爱", "自然", "语言", "处理"]
# postags = ["r", "v", "n", "n", "v"]
words = []
postags = []# 执行依存句法分析,返回句法树的弧结构
# arcs是一个包含多个元组的列表,每个元组表示一个词的依存关系
# 元组格式:(head, relation)
# head: 表示依存弧的父节点(中心词)的索引,0表示根节点
# relation: 表示依存关系类型
arcs = parser.parse(words, postags)# 打印原始分析结果(列表形式)
print("原始依存句法分析结果:", arcs)# 格式化输出依存关系,便于阅读
# 格式:词索引:依存关系类型
print("格式化依存句法分析结果:", '\t'.join("%d:%s" % (arc.head, arc.relation) for arc in arcs))# 释放模型资源
parser.release()
[(2, 'SBV'), (0, 'HED'), (2, 'VOB'), (5, 'ATT'), (7, 'ATT'), (5, 'RAD'), (3, 'VOB')]
依存句法分析: 2:SBV	0:HED	2:VOB	5:ATT	7:ATT	5:RAD	3:VOB

四单元 句法分析

  • 句法分析任务:
    • 短语结构句法分析(Phrase Structure Parsing)
      • 目标:分析句子的短语结构层次关系,将句子分解为短语(如名词短语、动词短语等),构建短语结构树(成分句法树)。
      • 目前研究最多,尤其适用于英语等形态变化丰富的语言。
      • PCFG(Probabilistic Context-Free Grammar,概率上下文无关文法):
        • 在传统上下文无关文法(CFG)基础上引入概率,能够为每种句法结构分配概率,选择概率最大的结构作为句子的最佳分析。
        • 常用算法:CKY算法(用于高效解析PCFG)。
      • 应用:机器翻译、自动语法纠错、句法树可视化等。
    • 依存句法分析(Dependency Parsing)
      • 目标:分析句子中词与词之间的依存关系,构建依存句法树(每个词有且仅有一个父节点,根节点除外)。
      • 适用于中文等以词序为主的语言,强调词之间的直接依赖关系。
      • 依存句法分析的五个基本条件:
        1. 一个句子只有一个成分是独立的(即句子的中心词或谓词,通常为谓语动词)。
        2. 句子的其他成分都从属于某一成分(每个词都有唯一的依存中心)。
        3. 任何一个成分都不能依存于两个或者两个以上的成分(依存关系是树状结构,不能有环)。
        4. 如果A从属于B,成分C位于二者之间,那么C就从属于A或B或A和B之间的某一成分(依存关系不能交叉)。
        5. 中心成分左右两边的其他成分互不发生关系(依存树的非交叉性)。
      • 常用方法:基于转移的依存分析(Transition-based)、基于图的依存分析(Graph-based)、神经网络依存分析(如Biaffine Parser)。
      • 应用:关系抽取、事件抽取、信息抽取、自动问答等。
    • 深层文法句法分析(Deep Grammar Parsing)
      • 目标:不仅分析表层的句法结构,还要揭示句子的深层语义结构和逻辑关系。
      • 代表方法:生成语法(Generative Grammar)、功能语法(Functional Grammar)、语义角色标注(SRL)、AMR(Abstract Meaning Representation)等。
      • 应用:语义理解、机器翻译、自动推理、复杂问答等。

五单元 NLP中的深度学习

  • 自然语言处理的三大特征抽取器:

    • CNN(卷积神经网络)

      • 适合提取局部特征,常用于文本分类、句子匹配等任务。
      • 通过卷积核滑动窗口捕捉n-gram特征,具有参数共享和局部感知能力。
      • 优点:并行计算高效,适合大规模文本处理。
      • 缺点:难以捕捉长距离依赖。
    • RNN(循环神经网络)

      • 适合处理序列数据,能够建模上下文依赖关系。

      • 缺点:

        1. 容易发生梯度消失(长距离依赖难以学习)。
        2. 容易发生梯度爆炸(训练不稳定)。
      • LSTM(长短时记忆网络):为了解决RNN的梯度消失问题而提出的特殊RNN结构。

        • LSTM在RNN的基础上引入了细胞状态(Cell State, Ct),可以长期保留信息。
        • LSTM的核心三个门:
          1. 遗忘门(Forget Gate):决定保留多少旧信息。
          2. 输入门(Input Gate):决定当前输入信息的多少被写入细胞状态。
          3. 输出门(Output Gate):决定细胞状态的哪些部分输出到下一个时刻。
        • 变体:
          • 双向LSTM(BiLSTM):同时考虑前后文信息。
          • GRU(门控循环单元):结构更简单,训练更高效。
    • Transformer

      • 完全基于自注意力机制(Self-Attention),摒弃了循环结构,极大提升了并行计算能力。
      • 结构特点:每个网络块由一个多头自注意力(Multi-Head Attention)层和一个前馈神经网络层组成。
      • 在解码阶段引入了掩码机制(Masked Multi-Head Attention),保证生成时只依赖已生成的内容。
      • Transformer是BERT、GPT等预训练大模型的基础架构。
      • 优点:捕捉长距离依赖能力强,训练速度快,易于扩展。

  • Encoder-Decoder框架
    • 传统RNN和LSTM要求输入输出长度固定,但如机器翻译等任务输入输出长度不定,需用Seq2Seq模型(输入序列,输出也是序列)。
    • Seq2Seq特点: 输入输出长度可变,适合翻译、摘要、对话等任务。
    • 结构:
      • Encoder(编码器): 将输入序列编码为一个固定长度的向量(上下文表示)。
      • Decoder(解码器): 将该向量解码为输出序列。
    • 应用: 机器翻译、文本摘要、对话系统等。

  • Attention机制
    • 传统Seq2Seq模型在处理长文本时,信息容易丢失,且对所有输入赋予相同权重,难以聚焦关键信息。
    • Attention机制允许模型在生成每个输出时动态关注输入序列的不同部分。
    • 三个阶段:
      1. 计算权重参数: 根据Query和Key计算相似性(如点积、余弦相似度、可学习参数)。
      2. 归一化权重: 通常用Softmax将权重归一化为概率分布。
      3. 加权求和: 用归一化权重对Value加权求和,得到Attention输出。
    • 多头注意力(Multi-Head Attention): 并行计算多个注意力头,捕捉不同子空间的特征。
    • 应用: 机器翻译、文本摘要、阅读理解、对话生成等。

六单元 文本向量化

  • One-hot编码
    • 原理:将每个词表示为一个全零向量,只有该词对应的下标为1,其余为0。例如,词表为[“我”, “爱”, “自然”, “语言”],"自然"的one-hot向量为[0, 0, 1, 0]。
    • 优点:实现简单,适合小规模词表的场景。
    • 缺点:
      • 随着语料库词语数量增加,词向量维度极高且稀疏,存储和计算效率低。
      • 不包含任何语义信息,无法表达词与词之间的相似性(如“猫”和“狗”之间的关系)。
  • 词袋模型(Bag of Words, BoW)
    • 原理:统计文本中每个词出现的次数,忽略词序,仅关注词频。每个文本表示为一个词频向量。
    • 优点:实现简单,适合文本分类等任务。
    • 缺点:
      • 词向量维度高且稀疏。
      • 仅将词语符号化,不保留词序信息,不包含任何语义信息。
      • 不适合表达长文本或复杂语义关系。
  • Word2Vec
    • 原理:通过神经网络将词映射到低维稠密向量空间,使得语义相近的词距离更近。
    • CBOW模型(Continuous Bag of Words)
      • 三层神经网络结构。
      • 已知上下文(周围词),预测当前词。
      • 上下文所有词对当前词的预测权重相同。
      • 适合大语料、训练速度快。
    • Skip-gram模型
      • 与CBOW相反:已知当前词,预测上下文。
      • 输入为目标词,输出为上下文词的概率分布。
      • 更适合小语料、低频词学习。
    • Word2Vec常用参数说明:
      • sentences:预训练的训练语料库(分词后的句子列表)。
      • sg:0表示CBOW模型,1表示Skip-gram模型(默认0)。
      • size:词向量维度(如100、200、300等)。
      • window:当前词与预测词之间的最大距离(窗口大小)。
      • min_count:最小出现次数,低于该次数的词会被忽略。
      • iter:随机梯度下降的迭代次数。
      • 例:Word2Vec(sentences, size=100, window=8, min_count=3, iter=8)
  • 补充:GloVe、FastText等
    • GloVe:全局向量模型,结合全局词共现统计和局部上下文窗口,提升了词向量的语义表达能力。
    • FastText:将词拆分为n-gram子词,能更好地处理未登录词和形态变化丰富的语言。
  • 应用场景举例
    • 文本分类、聚类、相似度计算、信息检索、推荐系统、知识图谱等。

七单元 关键词提取

在这里插入图片描述

  • TF-IDF 算法提取关键词步骤

    1. 文本分词与去停用词
      对原始文本进行分词处理,并去除停用词(如“的”“了”“是”等无实际意义的高频词),剩余词语即为候选关键词。
    2. 计算候选词的 TF 值
      统计每个候选词在当前文档中出现的频率(Term Frequency, TF),即
      TF(word) = word 在文档中出现的次数 / 文档总词数
    3. 计算候选词的逆文档频率 IDF
      统计每个候选词在整个语料库中出现的文档数,计算逆文档频率(Inverse Document Frequency, IDF):
      IDF(word) = log(语料库中文档总数 / (1 + 出现 word 的文档数量))
      这样可以降低在多数文档中都出现的常见词的权重。
    4. 计算 TF-IDF 值
      对每个候选词,计算其 TF-IDF 值:
      TF-IDF(word) = TF(word) * IDF(word)
      该值越高,说明该词对当前文档越重要。
    5. 排序与选取关键词
      将所有候选词的 TF-IDF 值进行降序排序,选择排在前面的若干词作为文档关键词。

    TextRank 算法

    • 基本思想:TextRank 是一种基于图的排序算法,思想来源于 Google 的 PageRank 算法。它通过构建词语之间的共现关系图,利用迭代计算确定每个词的重要性。
    • PageRank 算法:Google 用来衡量网页重要性的算法,基于有向无权图。
    • TextRank 与 PageRank 的不同:
      • PageRank:用于网页排序,图是有向无权图
      • TextRank:用于关键词或句子自动提取,图是有权图,边的权重通常表示词语或句子之间的相似度或共现频率。
    • TextRank 步骤简述:
      1. 将文本分词,去除停用词,选取候选词。
      2. 构建词语共现图(窗口内共现的词语之间连边)。
      3. 初始化每个节点的权重,迭代更新节点权重,直到收敛。
      4. 按权重排序,选取前 N 个词作为关键词。

    LSA(潜在语义分析)关键词提取

    1. 使用 BOW 模型将每个文档表示为向量
      对所有文档进行分词,统计词频,得到词袋模型(Bag of Words)表示。
    2. 构建词-文档矩阵
      将所有文档的词向量拼接起来,形成一个“词-文档”矩阵(行是词,列是文档,值为词频或TF-IDF)。
    3. 对词-文档矩阵进行奇异值分解(SVD)
      通过 SVD 将高维稀疏矩阵分解为低维稠密矩阵,提取潜在的主题结构。
    4. 关键词选取
      在低维空间中,计算每个词与文档的相似度,选取与文档最相似的若干词作为关键词。

八单元 文本分类

  • 基于传统机器学习文本分类方法的标准流程:
    1. 训练集准备
      • 收集并整理带有标签的文本数据,作为模型训练和评估的基础。
      • 标签可以是类别(如“体育”“财经”“科技”),也可以是情感极性(如“正面”“负面”)。
      • 通常将数据集划分为训练集、验证集和测试集。
    2. 文本预处理
      • 对原始文本进行清洗和规范化,包括:
        • 去除HTML标签、特殊符号、标点、数字等无关内容
        • 转换为统一大小写
        • 分词(中文用jieba、pkuseg等,英文用NLTK、spaCy等)
        • 去除停用词(如“的”“了”“and”“the”等)
        • 词形还原(英文如stemming/lemmatization)
      • 预处理的目的是减少噪声,提高特征表达的有效性。
    3. 特征提取
      • 将文本转化为数值特征向量,常见方法有:
        • 词袋模型(Bag of Words, BoW):统计词频
        • TF-IDF:考虑词频和逆文档频率
        • N-gram:提取词组特征
        • 词向量(Word2Vec、GloVe、FastText等)
      • 特征提取是文本分类效果的关键环节。
    4. 文本表示
      • 将特征向量化的文本输入到机器学习模型中。
      • 可以是稀疏向量(如BoW、TF-IDF),也可以是稠密向量(如Word2Vec、BERT等)。
      • 现代方法常用深度学习模型自动学习文本表示(如BERT、TextCNN、LSTM等)。
    5. 分类器训练与预测
      • 选择合适的分类算法进行模型训练,常见算法有:
        • 朴素贝叶斯(Naive Bayes)
        • 支持向量机(SVM)
        • 逻辑回归(Logistic Regression)
        • 决策树、随机森林、XGBoost等集成方法
        • 神经网络(如MLP、CNN、RNN、BERT等)
      • 训练完成后,对新文本进行特征提取和分类预测。
    6. 模型评估与优化
      • 使用准确率、精确率、召回率、F1分数等指标评估模型性能。
      • 通过交叉验证、调参、特征工程等方法优化模型效果。

流程图示意:

训练集 → 文本预处理 → 特征提取 → 文本表示 → 分类器训练 → 预

九单元 文本情感分析

  • 基于词典的情感分析方法
    • 原理:利用人工或半自动构建的情感词典(如褒义词、贬义词、否定词、程度副词等),通过统计文本中情感词的出现及其极性、强度,判断文本的情感倾向。
    • 流程:
      1. 文本分词,去除停用词。
      2. 检索情感词典,统计正面、负面词出现次数。
      3. 根据否定词、程度副词等修饰关系调整情感分数。
      4. 综合得分判断文本情感极性(如正面、负面、中性)。
    • 优点:实现简单、可解释性强、无需标注数据。
    • 缺点:依赖词典覆盖度,难以处理复杂语境、隐含情感、讽刺等现象。
    • 常用情感词典:知网情感词典、NTUSD、HowNet、SentiWordNet等。
  • 基于机器学习的情感分析方法
    • 原理:将情感分析建模为文本分类问题,利用有标注的情感数据训练分类器(如正面/负面)。
    • 流程:
      1. 收集并标注情感数据集(如影评、商品评论等)。
      2. 文本预处理(分词、去停用词、特征提取如BoW、TF-IDF、词向量等)。
      3. 选择分类算法(如朴素贝叶斯、SVM、逻辑回归、随机森林等)。
      4. 训练模型并评估,应用于新文本情感预测。
    • 优点:能自动学习特征,适应性强,效果优于词典法。
    • 缺点:需大量标注数据,特征工程复杂,难以处理长文本和上下文依赖。
    • 常用数据集:IMDB、SST、ChnSentiCorp等。
  • 基于深度学习的情感分析方法
    • 原理:利用神经网络(如CNN、RNN、LSTM、GRU、Transformer、BERT等)自动学习文本的情感特征,实现端到端的情感分类。
    • 流程:
      1. 文本预处理(分词、编码、词向量化)。
      2. 构建深度学习模型(如TextCNN、BiLSTM、BERT等)。
      3. 输入训练数据,自动学习情感特征。
      4. 预测新文本的情感极性或情感分数。
    • 优点:无需人工设计特征,能捕捉复杂语义和上下文信息,适合大规模数据和多类别情感分析。
    • 缺点:对数据和计算资源要求高,模型可解释性较弱。
    • 前沿方向:多模态情感分析(结合文本、语音、图像)、细粒度情感分析(如方面级情感)、跨语言情感分析等。

应用场景举例:

  • 产品评论情感分析(电商、App Store等)
  • 舆情监控与危机预警(微博、新闻评论等)
  • 用户满意度调查与反馈分析
  • 金融市场情绪分析
  • 智能客服自动情感识别与应答

代码示例:

代码示例:jieba 分词

精确模式分词
# 导入 jieba 分词库
import jieba# 使用 jieba 的精确模式分词
words = jieba.cut("南京市长江大桥")  # 对句子进行分词,返回一个生成器对象
print(words)  # 输出分词生成的迭代器对象
print("/".join(words))  # 将分词结果用斜杠连接并输出# 输出结果:
# 南京市/长江大桥

注释详解:

  1. jieba.cut:jieba 的分词方法,默认使用精确模式。
  2. print(words):直接打印生成器对象,显示的是内存地址。
  3. "/".join(words):将生成器对象转换为字符串,用斜杠分隔分词结果。

全模式分词
# 使用 jieba 的全模式分词
words = jieba.cut("南京市长江大桥", cut_all=True)  # 全模式分词,扫描句子中所有可能的词
print(words)  # 输出分词生成的迭代器对象
print("/".join(words))  # 将分词结果用斜杠连接并输出# 输出结果:
# 南京/南京市/京市/市长/长江/长江大桥/大桥

注释详解:

  1. cut_all=True:启用全模式分词,返回所有可能的词语组合。
  2. 全模式分词适合快速搜索,但不能解决歧义问题。

lcut 方法分词
# 使用 jieba 的 lcut 方法直接返回分词结果列表
words = jieba.lcut("南京市长江大桥", cut_all=True)  # 全模式分词
print(words)# 输出结果:
# ['南京', '南京市', '京市', '市长', '长江', '长江大桥', '大桥']

注释详解:

  1. jieba.lcut:与 jieba.cut 类似,但直接返回分词结果的列表。
  2. 列表形式更适合后续处理,如统计词频或关键词提取。

搜索引擎模式分词
# 使用 jieba 的搜索引擎模式分词
words = jieba.cut_for_search("南京市长江大桥")  # 搜索引擎模式分词
print(words)  # 输出分词生成的迭代器对象
print("/".join(words))  # 将分词结果用斜杠连接并输出# 输出结果:
# 南京/京市/南京市/长江/大桥/长江大桥

注释详解:

  1. jieba.cut_for_search:搜索引擎模式分词,适合对长文本进行分词。
  2. 搜索引擎模式会对长词进行再次切分,提高召回率。

lcut_for_search 方法分词
# 使用 jieba 的 lcut_for_search 方法直接返回分词结果列表
words = jieba.lcut_for_search("南京市长江大桥")
print(words)
print("/".join(words))# 输出结果:
# ['南京', '京市', '南京市', '长江', '大桥', '长江大桥']
# 南京/京市/南京市/长江/大桥/长江大桥

注释详解:

  1. jieba.lcut_for_search:与 jieba.cut_for_search 类似,但直接返回分词结果的列表。
  2. 搜索引擎模式适合对长文本进行分词,尤其是需要提高召回率的场景。

中文分词

代码
import jieba
import re# 定义函数,用于读取文件并进行分词
def Get_words(filename):with open(filename, encoding="utf-8") as f:file_context = f.read()  # 读取文件内容# 使用正则表达式去除特殊字符和标点符号file_context = re.sub(r"[0-9\s+\.\!\/_,$%^*()?;;:-【】+\"\']+|[+——!,;:。?、~@#¥%……&*()]+", "", file_context)words = jieba.lcut(file_context)  # 使用 jieba 的精确模式分词return words# 调用函数对文件进行分词
words = Get_words("D:/Pycharm/自然语言处理/day5/datas/chinese.txt")
print(words)  # 输出分词结果

注释详解
  1. 导入库

    • import jieba:导入 jieba 分词库,用于中文分词。
    • import re:导入正则表达式库,用于清理文本中的特殊字符。
  2. 定义函数

    • def Get_words(filename)::定义一个函数 Get_words,接收文件路径作为参数。
    • with open(filename, encoding="utf-8") as f::以 UTF-8 编码方式打开文件,确保中文字符正常读取。
    • file_context = f.read():读取文件内容并存储到变量 file_context 中。
  3. 清理文本

    • re.sub(...)
      

      :使用正则表达式去除文本中的特殊字符、标点符号和数字。

      • [0-9\s+\.\!\/_,$%^*()?;;:-【】+\"\']+:匹配数字、空格、标点符号等。
      • [+——!,;:。?、~@#¥%……&*()]+:匹配中文标点符号。
    • 清理后的文本存储在 file_context 中。

  4. 分词

    • jieba.lcut(file_context):使用 jieba 的 lcut 方法对清理后的文本进行分词,返回分词结果的列表。
  5. 返回结果

    • return words:返回分词结果。
  6. 调用函数

    • words = Get_words("D:/Pycharm/自然语言处理/day5/datas/chinese.txt"):调用 Get_words 函数,传入文件路径。
    • print(words):打印分词结果。

示例输出

假设文件内容为:

南京市长江大桥是中国著名的桥梁之一。

分词结果为:

['南京市', '长江大桥', '是', '中国', '著名', '的', '桥梁', '

代码示例:英文分词

代码
import nltk
import re# 定义函数,用于读取文件并进行英文分词
def Get_words(filename):with open(filename, encoding="utf-8") as f:file_context = f.read()  # 读取文件内容# 使用正则表达式去除特殊字符和标点符号file_context = re.sub(r"[0-9_.!+-=——,$%^,’。?、~@#¥%……&*《》<>「」{}【】()/]", "", file_context)words = nltk.word_tokenize(file_context)  # 使用 nltk 的分词工具进行分词return words# 调用函数对文件进行分词
words = Get_words("./datas/english.txt")
print(words)  # 输出分词结果

注释详解
  1. 导入库

    • import nltk:导入 NLTK(自然语言工具包),用于英文分词。
    • import re:导入正则表达式库,用于清理文本中的特殊字符。
  2. 定义函数

    • def Get_words(filename)::定义一个函数 Get_words,接收文件路径作为参数。
    • with open(filename, encoding="utf-8") as f::以 UTF-8 编码方式打开文件,确保英文字符正常读取。
    • file_context = f.read():读取文件内容并存储到变量 file_context 中。
  3. 清理文本

    • re.sub(...)
      

      :使用正则表达式去除文本中的特殊字符、标点符号和数字。

      • [0-9_.!+-=——,$%^,’。?、~@#¥%……&*《》<>「」{}【】()/]:匹配数字、标点符号和特殊字符。
    • 清理后的文本存储在 file_context 中。

  4. 分词

    • nltk.word_tokenize(file_context):使用 NLTK 的 word_tokenize 方法对清理后的文本进行分词,返回分词结果的列表。
  5. 返回结果

    • return words:返回分词结果。
  6. 调用函数

    • words = Get_words("./datas/english.txt"):调用 Get_words 函数,传入文件路径。
    • print(words):打印分词结果。

示例输出

假设文件内容为:

This is an example sentence. It contains numbers like 123 and symbols like $%.

分词结果为:

['This', 'is', 'an', 'example', 'sentence', 'It', 'contains', 'numbers', 'like', 'and', 'symbols', 'like']

代码示例:统计词频

代码
# 定义函数,用于统计词频
def count_words(words, topK):data = {}  # 初始化一个空字典,用于存储词频for word in words:  # 遍历分词结果中的每个词if word in data:  # 如果词已存在于字典中data[word] += 1  # 词频加 1else:  # 如果词不存在于字典中data[word] = 1  # 初始化词频为 1# 按词频从高到低排序,并返回前 topK 个词data = sorted(data.items(), key=lambda x: x[1], reverse=True)return data[:topK]  # 返回词频最高的 topK 个词# 调用函数,统计词频并输出结果
count_words(words, 5)

注释详解
  1. 函数定义

    • def count_words(words, topK):
      

      :定义一个函数

      count_words
      

      ,接收两个参数:

      • words:分词结果的列表。
      • topK:需要返回的高频词数量。
  2. 初始化字典

    • data = {}:创建一个空字典 data,用于存储词和对应的词频。
  3. 遍历分词结果

    • for word in words::遍历分词结果列表中的每个词。

    • if word in data:
      

      :检查当前词是否已经存在于字典中。

      • 如果存在,data[word] += 1:将该词的词频加 1。
      • 如果不存在,data[word] = 1:将该词添加到字典中,并初始化词频为 1。
  4. 排序

    • sorted(data.items(), key=lambda x: x[1], reverse=True)
      
      • data.items():将字典中的键值对转换为列表。
      • key=lambda x: x[1]:按词频(即字典的值)进行排序。
      • reverse=True:按降序排序。
  5. 返回结果

    • return data[:topK]:返回排序后的前 topK 个高频词。
  6. 调用函数

    • count_words(words, 5):调用 count_words 函数,传入分词结果 words 和需要返回的高频词数量 5

示例输入

假设分词结果 words 为:

['南京市', '长江大桥', '是', '中国', '著名', '的', '桥梁', '之一', '南京市', '桥梁']
示例输出
[('南京市', 2), ('桥梁', 2), ('长江大桥', 1), ('是', 1), (

代码示例:利用 pyltp 进行分词

代码
from pyltp import Segmentor# 初始化分词模型
segmentor = Segmentor("ltp_model/cws.model")  # 加载分词模型文件
# 对句子进行分词
words = segmentor.segment("我愿意把我生命的三分之一")  # 使用分词模型对句子进行分词
# 输出分词结果
for word in words:print(word, end="\\")  # 使用反斜杠分隔分词结果
# 释放模型
segmentor.release()  # 释放分词模型资源

注释详解
  1. 导入库

    • from pyltp import Segmentor:从 pyltp 库中导入 Segmentor 类,用于加载分词模型并执行分词任务。
  2. 初始化分词模型

    • segmentor = Segmentor("ltp_model/cws.model")
      
      • 创建 Segmentor 对象,并加载分词模型文件 cws.model
      • cws.model 是 LTP 提供的分词模型文件,路径需要根据实际情况调整。
  3. 分词

    • words = segmentor.segment("我愿意把我生命的三分之一")
      
      • 使用分词模型对输入句子进行分词。
      • 返回值 words 是一个分词结果的生成器对象。
  4. 输出分词结果

    • for word in words::遍历分词结果。
    • print(word, end="\\"):逐个输出分词结果,并使用反斜杠 \ 分隔。
  5. 释放模型

    • segmentor.release():释放分词模型资源,避免内存泄漏。

示例输出

假设输入句子为:

我愿意把我生命的三分之一

分词结果为:

我\愿意\把\我\生命\的\三分之一\

代码示例:利用 pyltp 进行词性标注

代码
from pyltp import Postagger# 初始化词性标注模型
postagger = Postagger("ltp_model/pos.model")  # 加载词性标注模型文件
# 对分词结果进行词性标注
postags = postagger.postag(words)  # 使用词性标注模型对分词结果进行标注
# 输出词性标注结果
for word, postag in zip(words, postags):  # 将分词结果与词性标注结果配对print(word, postag, end="\\")  # 输出词和对应的词性标注结果,用反斜杠分隔

注释详解
  1. 导入库

    • from pyltp import Postagger:从 pyltp 库中导入 Postagger 类,用于加载词性标注模型并执行标注任务。
  2. 初始化词性标注模型

    • postagger = Postagger("ltp_model/pos.model")
      
      • 创建 Postagger 对象,并加载词性标注模型文件 pos.model
      • pos.model 是 LTP 提供的词性标注模型文件,路径需要根据实际情况调整。
  3. 词性标注

    • postags = postagger.postag(words)
      
      • 使用词性标注模型对分词结果 words 进行标注。
      • 返回值 postags 是一个生成器对象,包含每个词对应的词性标注结果。
  4. 输出词性标注结果

    • for word, postag in zip(words, postags):
      
      • 使用 zip 函数将分词结果 words 和词性标注结果 postags 配对。
      • 遍历每个词和对应的词性标注结果。
    • print(word, postag, end="\\")
      
      • 输出词和对应的词性标注结果,用反斜杠 \ 分隔。

示例输入

假设分词结果 words 为:

['我', '愿意', '把', '我', '生命', '的', '三分之一']
示例输出
我 r\愿意 v\把 p\我 r\生命 n\的 u\三分之一 m\

词性标注说明

LTP 使用的词性标注标签集(部分示例):

  • r:代词
  • v:动词
  • p:介词
  • n:名词
  • u:助词
  • m:数词

代码示例:利用 pyltp 进行命名实体识别

代码
from pyltp import NamedEntityRecognizer# 初始化命名实体识别模型
recognizer = NamedEntityRecognizer("ltp_model/ner.model")  # 加载命名实体识别模型文件
# 对分词结果和词性标注结果进行命名实体识别
netags = recognizer.recognize(words, postags)  # 使用命名实体识别模型
# 输出命名实体识别结果
for word, netag in zip(words, netags):  # 将分词结果与命名实体标注结果配对print(word, netag, end="\\")  # 输出词和对应的命名实体标注结果,用反斜杠分隔

注释详解
  1. 导入库

    • from pyltp import NamedEntityRecognizer:从 pyltp 库中导入 NamedEntityRecognizer 类,用于加载命名实体识别模型并执行识别任务。
  2. 初始化命名实体识别模型

    • recognizer = NamedEntityRecognizer("ltp_model/ner.model")
      
      • 创建 NamedEntityRecognizer 对象,并加载命名实体识别模型文件 ner.model
      • ner.model 是 LTP 提供的命名实体识别模型文件,路径需要根据实际情况调整。
  3. 命名实体识别

    • netags = recognizer.recognize(words, postags)
      
      • 使用命名实体识别模型对分词结果 words 和词性标注结果 postags 进行识别。
      • 返回值 netags 是一个生成器对象,包含每个词对应的命名实体标注结果。
  4. 输出命名实体识别结果

    • for word, netag in zip(words, netags):
      
      • 使用 zip 函数将分词结果 words 和命名实体标注结果 netags 配对。
      • 遍历每个词和对应的命名实体标注结果。
    • print(word, netag, end="\\")
      
      • 输出词和对应的命名实体标注结果,用反斜杠 \ 分隔。

示例输入

假设分词结果 words 和词性标注结果 postags 为:

words = ['我', '愿意', '把', '我', '生命', '的', '三分之一']
postags = ['r', 'v', 'p', 'r', 'n', 'u', 'm']
示例输出
我 O\愿意 O\把 O\我 O\生命 O\的 O\三分之一 O\

命名实体标注说明

LTP 使用的命名实体标注标签集(BIESO 标注体系):

  • B:实体的开始(Begin)。
  • I:实体的中间(Inside)。
  • E:实体的结束(End)。
  • S:单独成实体(Single)。
  • O:非实体(Other)。

LTP 提供的命名实体类别:

  • Nh:人名
  • Ns:地名
  • Ni:机构名

代码示例:利用 pyltp 进行依存句法分析

代码
# 导入依存句法分析模块
from pyltp import Parser# 初始化依存句法分析模型
parser = Parser("ltp_model/parser.model")  # 加载依存句法分析模型文件# 对分词结果和词性标注结果进行依存句法分析
arcs = parser.parse(words, postags)  # 使用依存句法分析模型
print(arcs)  # 输出依存句法分析结果# 格式化输出依存句法分析结果
print("依存句法分析:", '\t'.join("%d:%s" % (arc[0], arc[1]) for arc in arcs))

注释详解
  1. 导入库

    • from pyltp import Parser:从 pyltp 库中导入 Parser 类,用于加载依存句法分析模型并执行分析任务。
  2. 初始化依存句法分析模型

    • parser = Parser("ltp_model/parser.model")
      
      • 创建 Parser 对象,并加载依存句法分析模型文件 parser.model
      • parser.model 是 LTP 提供的依存句法分析模型文件,路径需要根据实际情况调整。
  3. 依存句法分析

    • arcs = parser.parse(words, postags)
      
      • 使用依存句法分析模型对分词结果 words 和词性标注结果 postags 进行分析。
      • 返回值 arcs 是一个列表,包含每个词的依存关系和依存弧信息。
  4. 输出依存句法分析结果

    • print(arcs)
      
      • 直接输出依存句法分析结果,显示每个词的依存弧信息。
    • print("依存句法分析:", '\t'.join("%d:%s" % (arc[0], arc[1]) for arc in arcs))
      
      • 格式化输出依存句法分析结果。
      • arc[0]:表示当前词的依存中心词的索引。
      • arc[1]:表示当前词与依存中心词之间的依存关系。

示例输入

假设分词结果 words 和词性标注结果 postags 为:

words = ['我', '愿意', '把', '我', '生命', '的', '三分之一']
postags = ['r', 'v', 'p', 'r', 'n', 'u', 'm']
示例输出
[(2, 'SBV'), (0, 'HED'), (2, 'VOB'), (5, 'ATT'), (7, 'ATT'), (5, 'RAD'), (3, 'VOB')]
依存句法分析: 2:SBV	0:HED	2:VOB	5:ATT	7:ATT	5:RAD	3:VOB

依存句法分析说明
  1. 依存关系标签(部分示例)
    • SBV:主谓关系(Subject-Verb)。
    • HED:核心关系(Head)。
    • VOB:动宾关系(Verb-Object)。
    • ATT:定中关系(Attribute)。
    • RAD:右附加关系(Right Adjunct)。
  2. 依存弧信息
    • 每个词的依存弧由两个部分组成:
      • 中心词索引arc[0] 表示当前词的依存中心词在句子中的索引位置(从 1 开始)。
      • 依存关系arc[1] 表示当前词与中心词之间的依存关系。

代码示例:数据预处理与分词

代码
from gensim.models import Word2Vec  # 导入 gensim 的 Word2Vec 模型
import jieba  # 导入 jieba 分词库
import re  # 导入正则表达式库# 数据路径
data_Path = "./datas/chinese.txt"  # 文本数据路径
stopwords = "./datas/stopwords.txt"  # 停用词表路径# 定义函数,用于读取文件并进行分词
def getWords(datapath, stopwords_path):# 读取停用词表with open(stopwords_path) as a:stopwords = a.readlines()  # 逐行读取停用词new_stopwords = [i.strip() for i in stopwords]  # 去除换行符,生成停用词列表words_list = []  # 初始化分词结果列表# 读取文本数据with open(datapath, encoding="utf-8") as f:file_context = f.read()  # 读取文件内容context_list = file_context.split("。")  # 按句号分割文本,生成句子列表# 遍历每个句子for i in context_list:# 使用正则表达式去除特殊字符和标点符号i = re.sub(r"[0-9\s+\.\!\/_,$%^*()?;;:-【】+\"\']+|[+——!,;:。?、~@#¥%……&*()]+", "", i)word_list = jieba.lcut(i)  # 使用 jieba 的精确模式分词# 去除停用词for j in word_list:if j in new_stopwords:  # 如果词在停用词表中word_list.remove(j)  # 从分词结果中移除words_list.append(word_list)  # 将分词结果添加到分词结果列表中return words_list  # 返回分词结果列表# 调用函数对文件进行分词
words = getWords(data_Path, stopwords)

注释详解
  1. 导入库

    • from gensim.models import Word2Vec:导入 gensim 的 Word2Vec 模型,用于后续训练词向量。
    • import jieba:导入 jieba 分词库,用于中文分词。
    • import re:导入正则表达式库,用于清理文本中的特殊字符。
  2. 数据路径

    • data_Path = "./datas/chinese.txt":指定文本数据的路径。
    • stopwords = "./datas/stopwords.txt":指定停用词表的路径。
  3. 定义函数

    • def getWords(datapath, stopwords_path):
      

      :定义一个函数

      getWords
      

      ,接收两个参数:

      • datapath:文本数据的路径。
      • stopwords_path:停用词表的路径。
  4. 读取停用词表

    • with open(stopwords_path) as a::打开停用词表文件。
    • stopwords = a.readlines():逐行读取停用词。
    • new_stopwords = [i.strip() for i in stopwords]:去除换行符,生成停用词列表。
  5. 初始化分词结果列表

    • words_list = []:创建一个空列表 words_list,用于存储分词结果。
  6. 读取文本数据

    • with open(datapath, encoding="utf-8") as f::以 UTF-8 编码方式打开文本数据文件。
    • file_context = f.read():读取文件内容。
    • context_list = file_context.split("。"):按句号分割文本,生成句子列表。
  7. 清理文本

    • re.sub(...)
      

      :使用正则表达式去除文本中的特殊字符和标点符号。

      • [0-9\s+\.\!\/_,$%^*()?;;:-【】+\"\']+:匹配数字、空格、标点符号等。
      • [+——!,;:。?、~@#¥%……&*()]+:匹配中文标点符号。
  8. 分词

    • jieba.lcut(i):使用 jieba 的 lcut 方法对清理后的句子进行分词,返回分词结果的列表。
  9. 去除停用词

    • 遍历分词结果 word_list,如果词在停用词表中,则从分词结果中移除。
  10. 存储分词结果

    • words_list.append(word_list):将分词结果添加到分词结果列表中。
  11. 返回结果

    • return words_list:返回分词结果列表。
  12. 调用函数

    • words = getWords(data_Path, stopwords):调用 getWords 函数,传入文本数据路径和停用词表路径。

示例输入

假设文本数据 chinese.txt 内容为:

南京市长江大桥是中国著名的桥梁之一。

假设停用词表 stopwords.txt 内容为:

是
的
示例输出
[['南京市', '长江大桥', '中国', '著名', '桥梁', '之一']]
train_model = Word2Vec(words, size=200, window=6, min_count=2, workers=4, sg=1) ## 训练word2vec  skip-gram模型,指定向量维度是200# 指定上下文窗口为6,即当前词与预测词在一个句子中的最大距离是6 
#词频少于2次数的单词会被丢弃掉
#sg用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法
train_model.save('./skip-gram.model') #保存模型
class gensim.models.word2vec.Word2Vec(sentences=None,size=100,alpha=0.025,window=5, min_count=5, max_vocab_size=None, sample=0.001,seed=1, workers=3,min_alpha=0.0001, sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=,iter=5,null_word=0, trim_rule=None, sorted_vocab=1, batch_words=10000)参数:· sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或LineSentence构建。· sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。· size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。· window:表示当前词与预测词在一个句子中的最大距离是多少· alpha: 是学习速率· seed:用于随机数发生器。与初始化词向量有关。· min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5· max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。· sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5)· workers参数控制训练的并行数。· hs: 如果为1则会采用hierarchical softmax技巧。如果设置为0(defaut),则negative sampling会被使用。· negative: 如果>0,则会采用negativesamping,用于设置多少个noise words· cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defaut)则采用均值。只有使用CBOW的时候才起作用。· hashfxn: hash函数来初始化权重。默认使用python的hash函数· iter: 迭代次数,默认为5· trim_rule: 用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回 RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的函数。· sorted_vocab: 如果为1(defaut),则在分配word index 的时候会先对单词基于频率降序排序。· batch_words:每一批的传递给线程的单词的数量,默认为10000
# 导入NLTK的文本集合类(用于构建语料库和计算文本统计量)和分词工具
from nltk.text import TextCollection
from nltk.tokenize import word_tokenize  # 原始语料数据:包含3个英文句子的列表(作为语料库的原始文本)
sents = ['this is sentence one', 'this is sentence two', 'this is sentence three']# 对每个句子进行分词处理(将连续字符串拆分为独立单词的列表)
# word_tokenize是NLTK的分词函数,此处按空格分割(句子无标点)
sents = [word_tokenize(sent) for sent in sents]  # 列表推导式:遍历每个句子并分词# 打印分词结果(验证分词是否成功)
print(sents)  # 输出:[['this', 'is', 'sentence', 'one'], ['this', 'is', 'sentence', 'two'], ['this', 'is', 'sentence', 'three']]# 基于分词后的句子列表构建语料库对象(TextCollection会自动统计语料全局信息)
# 语料库包含所有分词后的句子,用于后续计算词频、TF-IDF等统计量
corpus = TextCollection(sents)# 打印语料库对象(验证语料库是否成功构建)
print(corpus)  # 输出:<Text: this is sentence one this is sentence two...>(省略部分内容)# 计算词语"one"在语料库中的TF-IDF值
# 参数1:目标词语(字符串);参数2:语料库对象(或具体文档,此处直接用语料库)
# 本例结果为1/12≈0.0833(因语料库小,NLTK简化了TF-IDF计算逻辑)
tf_idf = corpus.tf_idf('one', corpus)# 打印计算结果(TF-IDF值)
print(tf_idf)  # 输出:0.08333333333333333
# 导入jieba的文本分析模块(包含TF-IDF关键词提取等功能)
import jieba.analyse  # 读取本地中文文本文件(假设文件路径为当前目录下的datas文件夹中的chinese.txt)
# 使用with open上下文管理器自动关闭文件,指定编码为utf-8(兼容中文文本)
with open("./datas/chinese.txt", encoding='utf-8') as f:fileTxt = f.read()  # 读取文件全部内容并存储到变量fileTxt中# 使用jieba的TF-IDF算法提取文本关键词(核心功能)
# jieba.analyse.extract_tags是jieba内置的关键词提取函数,默认基于TF-IDF算法
# 参数说明:
# - fileTxt:待分析的文本内容(字符串类型)
# - topK=6:指定返回前6个权重最高的关键词(若文本关键词不足6个则返回实际数量)
# - withWeight=False:是否返回关键词及其权重值(False表示仅返回关键词列表)
# - allowPOS=():允许的词性列表(空元组表示不限制词性,提取所有可能的关键词)
keywords = jieba.analyse.extract_tags(fileTxt, topK=6, withWeight=False, allowPOS=())  # 打印提取的关键词列表(验证结果)
# 输出示例:['秋天', '北方', '秋雨', '感觉', '北平', '味道'](具体结果取决于文本内容)
print(keywords)
# 导入jieba的文本分析模块(包含TextRank关键词提取等功能)
import jieba.analyse  # 定义待分析的中文文本内容(关于"周又元星"命名的新闻片段)
# 使用反斜杠连接多行字符串,保持代码可读性
text = "来源:中国科学报本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式," \"我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。国家天文台党委书记、" \"副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”" \"据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站," \"获得国际永久编号第120730号。2018年9月25日,经国家天文台申报," \"国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会," \"正式将该小行星命名为“周又元星”。"  # 使用jieba的TextRank算法提取文本关键词(核心功能)
# jieba.analyse.textrank是基于TextRank图模型的关键词提取函数,适用于挖掘文本中高关联度的核心词汇
# 参数说明:
# - text:待分析的文本内容(字符串类型)
# - topK=6:指定返回前6个权重最高的关键词(若文本关键词不足6个则返回实际数量)
# (注:默认withWeight=False,即不返回权重值;allowPOS参数可限制词性,此处未设置表示不限制)
keywords = jieba.analyse.textrank(text, topK=6)  # 打印提取的关键词列表(验证结果)
# 输出示例:['小行星', '命名', '国际', '中国', '国家', '天文学家'](结果反映文本核心内容)
# TextRank算法通过词间共现关系构建图模型,权重高的词通常是文本中频繁出现且与其他词关联紧密的核心词
print(keywords)
# 从gensim库导入语料库处理模块和模型模块(用于构建词典、训练LDA主题模型)
from gensim import corpora, models  def LDA_model(words_list):"""基于Gensim库实现LDA主题模型训练,提取文本中的潜在主题参数:words_list (list): 分词后的文档列表,格式为[["词1","词2",...], ["词1","词3",...], ...]返回:list: 主题与关键词的列表,每个元素格式为(主题ID, "主题关键词: 词1*权重 + 词2*权重 + ...")"""# ---------------------- 步骤1:构造文本词典 ----------------------# 使用Gensim的Dictionary类创建词典(核心作用:为每个唯一单词分配唯一ID,并统计词频)# 遍历words_list中所有文档的分词结果,收集所有不重复的单词,生成{单词: 唯一ID}的映射# 例如:若words_list包含["苹果","香蕉"], ["香蕉","橘子"],则词典可能为{"苹果":0, "香蕉":1, "橘子":2}dictionary = corpora.Dictionary(words_list)# ---------------------- 步骤2:将文本转换为词袋向量 ----------------------# 将每篇文档转换为"词袋(Bag-of-Words)"向量表示# doc2bow()方法遍历文档中的每个单词,根据词典映射为(单词ID, 词频)的元组# 最终corpus是一个列表,每个元素对应一篇文档的词袋向量(如:[[(0,1), (1,2)], ...] 表示第一篇文档中ID=0的词出现1次,ID=1的词出现2次)corpus = [dictionary.doc2bow(words) for words in words_list]# ---------------------- 步骤3:训练LDA主题模型 ----------------------# 初始化LDA模型(核心主题建模算法,用于发现文本中的潜在主题分布)# 参数说明:# - corpus: 输入的词袋向量语料库(步骤2的输出结果)# - num_topics=5: 设定要提取的主题数量(需根据业务需求调整,如新闻文本可能设10个主题)# - id2word=dictionary: 词典对象(用于将单词ID映射回实际单词字符串,便于后续解读主题)# - passes=10: 模型训练时遍历语料库的次数(次数越多模型越稳定,但计算成本越高)lda_model = models.ldamodel.LdaModel(corpus=corpus, num_topics=5, id2word=dictionary, passes=10)# ---------------------- 步骤4:输出主题与关键词 ----------------------# 打印所有主题的关键词及权重(核心结果:每个主题由一组高权重的关键词代表)# 参数说明:# - num_topics=5: 指定要显示的主题数量(与模型训练时的num_topics一致)# - num_words=3: 每个主题显示前3个最相关的关键词(可根据需求调整,如显示5个)# 输出格式示例:[(0, '0.500*"苹果" + 0.300*"香蕉"'), (1, '0.600*"橘子" + 0.200*"水果"'), ...]topic_words = lda_model.print_topics(num_topics=5, num_words=3)return topic_words
# 导入jieba的词性标注模块(用于分词时同时获取词语的词性)
import jieba.posseg as jp  def get_text(texts):  # 修正:原参数名text应为texts(遍历输入的文本列表)"""对输入的文本列表进行分词、词性过滤和停用词过滤,输出处理后的分词列表参数:texts (list): 原始文本列表,格式为["文本1", "文本2", ...]返回:list: 处理后的分词列表,格式为[["词1","词2",...], ["词3","词4",...], ...]"""# 定义需要保留的词性(名词、人名、地名、机构名、英文、动词、副词)# 词性标签说明:n=名词, nr=人名, ns=地名, nt=机构名, eng=英文, v=动词, d=副词flags = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd')  # 定义停用词(无实际意义需过滤的高频词)stopwords = ('的', '就', '是', '用', '还', '在', '上', '作为')  words_list = []  # 存储每篇文本处理后的分词结果# 遍历每篇原始文本进行处理for text in texts:# 核心处理逻辑:# 1. jp.cut(text):使用jieba的词性标注分词,返回带词性的词语对象(w.word是词语,w.flag是词性)# 2. 过滤条件:词语词性在flags中(只保留指定词性)且词语不在stopwords中(排除无意义词)# 3. [w.word for ...]:提取符合条件的词语本身,组成当前文本的分词列表words = [w.word for w in jp.cut(text) if w.flag in flags and w.word not in stopwords]words_list.append(words)  # 将当前文本的分词结果添加到总列表return words_list  # 定义原始文本列表(包含手机和汽车相关的产品描述)
texts = ['作为千元机中为数不多拥有真全面屏的手机,OPPO K3一经推出,就簇拥不少粉丝', '很多人在冲着这块屏幕购买了OPPO K3之后,发现原来K3的过人之处不止是在屏幕上', 'OPPO K3的消费者对这部手机总体还是十分满意的', '吉利博越PRO在7月3日全新吉客智能生态系统GKUI19发布会上正式亮相', '今年上海车展,长安CS75 PLUS首次亮相', '普通版车型采用的是双边共双出式排气布局;运动版本车型采用双边共四出的排气布局'
]  # 调用get_text函数处理原始文本,获取分词后的文本列表
words_list = get_text(texts)# 打印分词结果(验证处理效果)
print('分词后的文本:')
print(words_list)  
# 输出示例:[['拥有', '真', '全面', '手机', 'OPPO', 'K3', '一经', '推出', '簇拥', '不少', '粉丝'], ...](已过滤停用词和非目标词性)# 调用之前定义的LDA_model函数训练主题模型(需确保LDA_model已正确定义)
# 输入:处理后的分词列表words_list(每篇文本的分词结果)
# 输出:5个主题及其前3个关键词(格式:[(主题ID, "关键词1*权重 + 关键词2*权重 + ..."), ...])
LDA_model(words_list)  
# 输出示例:[(0, '0.069*"亮相" + 0.069*"吉利" + 0.069*"智能"'), ...](主题反映文本的核心内容,如手机型号、汽车品牌等)

文本分类

# 导入数据处理与分析库(pandas用于表格数据操作,numpy用于数值计算)
import pandas as pd
import numpy as np# 导入Word2Vec词向量模型(用于后续文本向量化处理,将词语转换为数值向量)
from gensim.models import Word2Vec# 导入nltk的分词工具(用于英文文本的分词,将句子拆分为独立单词)
from nltk.tokenize import word_tokenize  # 读取TSV格式的短信数据集(TSV:Tab Separated Values,用制表符分隔的文本文件)
# pd.read_table是pandas读取分隔符文本文件的通用方法(默认分隔符为制表符)
# 参数说明:
# - "./sms.tsv":文件路径(当前目录下的sms.tsv文件)
# - header=None:指定文件无表头行(即第一行数据不视为列名)
# - names=['label', 'message']:手动为数据框指定列名(label表示短信类别,message表示短信内容)
sms = pd.read_table("./sms.tsv", header=None, names=['label', 'message'])  

使用bow词袋模型提取特征

# 从scikit-learn的特征提取模块导入文本向量化工具(用于将文本转换为词袋特征)
from sklearn.feature_extraction.text import CountVectorizer  def bow_extractor(corpus):"""使用词袋模型(Bag-of-Words, BoW)提取文本特征,将文本转换为数值化的词频矩阵参数:corpus (list): 原始文本语料库,格式为["文本1", "文本2", ..., "文本n"]返回:sparse matrix: 词频特征矩阵(每行对应一篇文本,每列对应一个词语,值为该词在文本中的出现次数)"""# ---------------------- 步骤1:初始化词袋模型向量化器 ----------------------# CountVectorizer是scikit-learn中实现词袋模型的核心工具,用于统计词语出现频率# 参数说明:# - stop_words="english": 指定自动过滤英文停用词(如"the", "and", "is"等无实际意义的高频词)# - decode_error='ignore': 当遇到无法解码的字符时忽略错误(避免因编码问题导致程序崩溃)# - min_df=1: 保留在至少1篇文本中出现的词语(若设为2,则仅保留在≥2篇文本中出现的词,用于过滤低频词)# - ngram_range=(1,1): 提取1-gram特征(即单个词语,不考虑词语组合;若设为(1,2)则同时提取单词语和双词语组合)count_vect = CountVectorizer(stop_words="english", decode_error='ignore', min_df=1, ngram_range=(1,1))  # ---------------------- 步骤2:拟合模型并转换文本为词频矩阵 ----------------------# fit_transform()是核心方法,包含两个操作:# 1. fit(拟合):遍历所有文本,统计词语的全局信息(如所有出现的词语、词频等),生成词典# 2. transform(转换):将每篇文本转换为词频向量(向量长度为词典大小,值为对应词语的出现次数)# features是一个稀疏矩阵(sparse matrix),形状为(文本数量,词典大小)# 示例:若corpus包含["I love you", "He loves you"],词典为["I", "love", "you", "He", "loves"]# 则转换后的矩阵为[[1,1,1,0,0], [0,0,1,1,1]](每一行对应一篇文本的词频)features = count_vect.fit_transform(corpus)  return features
# 从scikit-learn预处理模块导入标签编码工具(用于将文本标签转换为数值形式)
from sklearn.preprocessing import LabelEncoder
# 从scikit-learn线性模型模块导入逻辑回归分类器(用于后续分类任务)
from sklearn.linear_model import LogisticRegression
# 从scikit-learn指标模块导入准确率计算函数(用于评估模型性能)
from sklearn.metrics import accuracy_score
# 从scikit-learn模型选择模块导入训练集-测试集划分工具(用于分离训练数据和测试数据)
from sklearn.model_selection import train_test_split  # ---------------------- 步骤1:编码分类标签(将文本标签转换为数值) ----------------------
# 初始化标签编码器(LabelEncoder用于将字符串形式的分类标签转换为0/1/2...的数值形式)
y_encoder = LabelEncoder()
# 对短信数据集中的"label"列(分类标签,如"spam"/"ham")进行编码
# fit_transform()方法:先拟合数据(统计所有唯一标签),再将标签转换为数值(如"ham"→0,"spam"→1)
y = y_encoder.fit_transform(sms['label'])  # y是编码后的数值标签数组,形状为(样本数,)# ---------------------- 步骤2:提取文本特征(使用词袋模型转换短信内容) ----------------------
# 调用之前定义的bow_extractor函数,将短信内容("message"列)转换为词袋特征矩阵
# bow_extractor的输入是文本列表(sms['message']),输出是词频稀疏矩阵(每行对应一条短信,每列对应一个词语)
x = bow_extractor(sms['message'])  # x是文本特征矩阵,形状为(样本数, 词典大小)

使用tf-idf提取特征

# 从scikit-learn的特征提取模块导入TF-IDF向量化工具(用于将文本转换为TF-IDF特征矩阵)
from sklearn.feature_extraction.text import TfidfVectorizer  def tfidf_extractor(corpus):"""使用TF-IDF(词频-逆文档频率)模型提取文本特征,将文本转换为数值化的TF-IDF权重矩阵参数:corpus (list): 原始文本语料库,格式为["文本1", "文本2", ..., "文本n"]返回:sparse matrix: TF-IDF特征矩阵(每行对应一篇文本,每列对应一个词语,值为该词在文本中的TF-IDF权重)"""# ---------------------- 步骤1:初始化TF-IDF向量化器 ----------------------# TfidfVectorizer是scikit-learn中实现TF-IDF模型的核心工具,结合了词袋模型与TF-IDF权重计算# 参数说明:# - stop_words="english": 指定自动过滤英文停用词(如"the", "and", "is"等无实际意义的高频词)# - decode_error='ignore': 当遇到无法解码的字符时忽略错误(避免因编码问题导致程序崩溃)# (其他可选参数:min_df=2过滤低频词,ngram_range=(1,2)提取单词语+双词语组合等,此处使用默认值)tfidf_transformer = TfidfVectorizer(stop_words="english", decode_error='ignore')  # ---------------------- 步骤2:拟合模型并转换文本为TF-IDF矩阵 ----------------------# fit_transform()是核心方法,包含两个操作:# 1. fit(拟合):遍历所有文本,统计词语的全局信息(如所有出现的词语、词频、文档频率等)# 2. transform(转换):将每篇文本转换为TF-IDF向量(向量长度为词典大小,值为对应词语的TF-IDF权重)# feature是一个稀疏矩阵(sparse matrix),形状为(文本数量,词典大小)# 示例:若某词在多篇文本中高频出现(如"the"),则其TF-IDF权重较低;若某词在少量文本中高频出现(如"spam"),则权重较高feature = tfidf_transformer.fit_transform(corpus)  return feature

拆分训练集和测试集,其中测试集比例是30%,随机值为5

## 拆分训练集和测试集(测试集比例30%,随机种子固定为5以保证结果可复现)
X_train, X_test, y_train, y_test = train_test_split(x, y,              # x是文本特征矩阵(如BoW或TF-IDF特征),y是编码后的标签test_size=0.3,     # 测试集占比30%(剩余70%为训练集)random_state=5     # 随机种子设为5(确保每次运行代码时数据拆分结果一致)
)

使用逻辑回归进行文本分类

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
model = LogisticRegression() ## 模型初始化
model.fit(X_train, y_train) ##训练模型
test_y_pred = model.predict(X_test) #对测试集进行预测
accuracy_score(y_test, test_y_pred)  #计算预测准确率0.9796650717703349

使用随机森林进行文本分类

from sklearn.ensemble import RandomForestClassifier 
clf = RandomForestClassifier(max_depth=100, random_state=41)  ## 模型初始化,最大深度为100,随机值41
clf.fit(X_train, y_train)  ##训练模型
test_y_pred = clf.predict(X_test) #对测试集进行预测
accuracy_score(y_test, test_y_pred)  #计算预测准确率0.9748803827751196

词云

# 导入必要的库
# jieba:中文分词工具,用于将文本分割成词语(词云生成前的关键预处理步骤)
# WordCloud:词云生成核心库,用于根据文本内容生成词云图像
# re:正则表达式库(本例未直接使用,可能用于文本清洗,可根据实际需求添加)
# matplotlib.pyplot:绘图库,用于显示生成的词云图像
import jieba
from wordcloud import WordCloud
import re
import matplotlib.pyplot as plt  def getW(datapath):"""读取指定路径的文本文件内容参数:datapath (str): 文本文件的路径(如"./datas/chinese.txt")返回:str: 文件的全部文本内容(字符串格式)"""# 使用with open上下文管理器读取文件(自动关闭文件,避免资源泄露)# encoding="utf-8":指定文件编码格式(兼容中文文本)with open(datapath, encoding="utf-8") as f:file_context = f.read()  # 读取文件所有内容并存储到变量return file_context  # ---------------------- 步骤1:读取文本数据 ----------------------
# 定义文本文件路径(假设文件位于当前目录下的datas文件夹中的chinese.txt)
data_Path = "./datas/chinese.txt"
# 调用getW函数读取文本内容(words变量存储原始文本字符串)
words = getW(data_Path)  # ---------------------- 步骤2:生成词云对象 ----------------------
# 初始化WordCloud对象(核心参数设置)
# 参数说明:
# - font_path="mywc.ttf":指定中文字体文件路径(必选!WordCloud默认不包含中文字体,需手动提供ttf格式字体文件)
# - background_color="white":词云背景颜色(可选,默认黑色)
# - width=500, height=400:词云图像的宽度和高度(像素)
# - margin=2:词云边缘留白(像素值,控制词语之间的间距)
wordcloud = WordCloud(font_path="mywc.ttf",background_color="white",width=500,height=400,margin=2
).generate(words)  # generate()方法:根据输入文本生成词云(自动统计词语频率并布局)  # ---------------------- 步骤3:使用matplotlib显示词云 ----------------------
# 创建绘图窗口(1行1列子图,图像尺寸17英寸×9英寸)
fig, ax = plt.subplots(1, 1, figsize=(17, 9))# 在子图中显示词云图像(imshow()用于显示二维图像)
ax.imshow(wordcloud)# 隐藏坐标轴的边框(上、右、下、左四边)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)# 隐藏x轴和y轴的刻度及标签(避免干扰词云显示)
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)# 显示绘图窗口(弹出窗口或在Jupyter中嵌入显示)
plt.show()  # ---------------------- 步骤4:保存词云图像到本地 ----------------------
# to_file()方法:将词云图像保存为指定路径的图片文件(支持png、jpg等格式)
# 本例保存到"result"文件夹下的"1.png"(需确保result文件夹已存在,否则会报错)
wordcloud.to_file("result/1.png")  

image-20250610134906438
如果对大家有用的话,希望多多点赞,关注,转发。谢谢!!!
如果需要相关资料,看看我的绑定资源上传吧。

相关文章:

  • 使用RAG的思想进行PPT生成的框架思路-SlideCoder
  • 语言模型进化论:从“健忘侦探”到“超级大脑”的破案之旅
  • Unity动画的RootMotion
  • [特殊字符] Harmony OS Next里的Web组件:网页加载的全流程掌控手册
  • 精益数据分析(101/126):SaaS商业模式优化与用户生命周期价值提升策略
  • 微服务--Gateway网关
  • 漏洞(网络空间安全真相)
  • SpringAI使用总结
  • Windows MySQL8密码忘了解决办法
  • NLP 基础概念
  • 阿里云 Linux 运维常见问题及深度解决方案
  • 图数据库介绍及应用,go和Java使用图数据库
  • NLP学习路线图(四十五):偏见与公平性
  • C语言多进程TCP服务器与客户端
  • I/O模式之epoll,本文会讲到epoll的相关接口以及底层,还会涉及水平和边缘工作模式,以及通过epoll相关接口实现一个水平工作模式服务端
  • @Profile, @Conditional, @ConditionalOnMissingBean, @ConditionalOnClass
  • 七大技术路线解析:自动驾驶如何被数据重新定义
  • 在python中获取符合特定模式的文件
  • 【互联网基础】互联网公司机房怎么设计
  • kylin 10 安装 redis-7.4.4
  • 做网站赚多少/抖音营销软件
  • 做网站计划/福州短视频seo获客
  • wordpress jquery版本/优化大师破解版app
  • 云主机如何建网站/东莞网站建设最牛
  • 西安的网站建设网站/惠州网站营销推广
  • 做网站用php转html/百度指数 移民