为了简单直观的理解模型训练,我这里搜集了两个简单的实现文本情感分类的例子,第一个例子基于朴素贝叶斯分类器,第二个例子基于逻辑回归,通过这两个例子,掌握词袋模型(Bag of Words)实现文本情感分类的基本原理,加深对机器学习的理解。
示例一
一、任务目标
使用词袋模型(BoW),将文本转化为数值向量,训练一个情感分类模型,判断句子是“积极”还是“消极”。
二、示例数据集
假设我们有以下4条标注好的训练数据:
1. "这个电影太棒了!"           → 积极
 2. "剧情糟糕,浪费时间。"        → 消极
 3. "演员演技非常好,推荐!"     → 积极
 4. "特效差,不建议观看。"       → 消极
三、实现原理
词袋模型的核心思想:
 将文本看作一个“装满单词的袋子”,忽略词序和语法,只统计每个单词出现的次数。
四、实现步骤
1. 文本预处理
-  
分词:将句子拆分为单词(中文需分词工具,英文按空格拆分)。
 -  
去除停用词:过滤无意义的词(如“的”、“了”、“,”)。
 -  
统一小写:英文需统一为小写,中文无需此步骤。
 
1. ["电影", "太棒"]
 2. ["剧情", "糟糕", "浪费", "时间"]
 3. ["演员", "演技", "非常", "好", "推荐"]
 4. ["特效", "差", "建议", "观看"]
2. 构建词袋(词汇表)
收集所有训练数据中的唯一单词,构建词汇表:
词汇表 = ["电影", "太棒", "剧情", "糟糕", "浪费", "时间", 
         "演员", "演技", "非常", "好", "推荐", "特效", "差", "建议", "观看"]
3. 文本向量化
将每个句子转换为一个向量,表示词汇表中每个单词的出现次数。
示例向量化结果:
1. "电影太棒"        → [1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 2. "剧情糟糕浪费时间" → [0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
 3. "演员演技非常好推荐" → [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0]
 4. "特效差建议观看"   → [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
4. 训练分类模型
使用朴素贝叶斯分类器(适合文本分类)进行训练:

5. 使用模型预测新句子
示例输入:"特效很棒但演员差"
步骤:
-  
预处理:分词 → ["特效", "很棒", "演员", "差"]
 -  
向量化:根据词汇表生成向量:
 
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
 (词汇表中"特效"=位置11,"演员"=位置6,"差"=位置12,其他词未出现)
3.预测:

五、通俗解释
-  
词袋模型:像把句子里的单词倒进一个袋子,只数每个单词出现的次数,不管顺序。
 -  
训练过程:模型通过统计哪些词常出现在“积极”句,哪些词常出现在“消极”句,学习判断规律。
 -  
预测过程:新句子被拆解为单词后,模型根据学到的规律,计算属于“积极”或“消极”的概率。
 
六、完整代码示例(Python)
from sklearn.feature_extraction.text import CountVectorizer
 from sklearn.naive_bayes import MultinomialNB
# 训练数据
 sentences = [
     "这个电影太棒了!",
     "剧情糟糕,浪费时间。",
     "演员演技非常好,推荐!",
     "特效差,不建议观看。"
 ]
 labels = [1, 0, 1, 0]  # 1=积极,0=消极
# 1. 文本向量化(自动处理分词和停用词需中文分词工具,此处简化手动处理)
 # 手动定义词袋向量(实际应使用CountVectorizer)
 X_train = [
     [1,1,0,0,0,0,0,0,0,0,0,0,0,0,0],  # 电影太棒
     [0,0,1,1,1,1,0,0,0,0,0,0,0,0,0],  # 剧情糟糕浪费时间
     [0,0,0,0,0,0,1,1,1,1,1,0,0,0,0],  # 演员演技非常好推荐
     [0,0,0,0,0,0,0,0,0,0,0,1,1,1,1]   # 特效差建议观看
 ]
# 2. 训练模型
 model = MultinomialNB()
 model.fit(X_train, labels)
# 3. 预测新句子
 new_sentence = "特效很棒但演员差"
 # 手动向量化(实际需自动分词和映射)
 new_vector = [0,0,0,0,0,0,0,0,0,0,0,1,1,0,0]  # 特效、演员、差
 prediction = model.predict([new_vector])
 print("预测结果:", "积极" if prediction[0] == 1 else "消极")  # 输出:消极
七、总结
-  
词袋模型优点:简单易实现,适合小规模数据。
 -  
缺点:忽略词序和语义(如“好不”和“不好”会被视为相同)。
 -  
进阶方向:TF-IDF、N-gram、词嵌入(Word2Vec)等更复杂的文本表示方法。
 
示例二
词袋模型(BoW)是一种将文本转化为数值表示的常见方法,用于文本分类任务。首先,我们从一组文本中提取词汇,例如,句子“我喜欢读书”和“我讨厌读书”,得到词汇表:“我”、“喜欢”、“读书”、“讨厌”。接着,将每个句子转化为向量,每个维度对应一个词,表示该词在句子中是否出现或出现的频率。接下来,我们可以使用逻辑回归等分类器训练模型,最后用训练好的模型来预测新文本的情感。
一、基本原理
词袋模型的思想:
 词袋模型将文本看作一个“词袋”,忽略单词之间的顺序,只关注每个单词出现的频率。这样,每篇文本就可以表示为一个向量,向量的每个维度对应一个词汇表中的词,其值为该词在文本中出现的次数(或经过其他处理后的权重,如TF-IDF)。
情感分类任务:
 在情感分类任务中,我们希望根据文本的内容判断其情感倾向(例如正面或负面)。利用词袋模型,将文本转化为数值特征后,可以用常见的监督学习算法(如逻辑回归、朴素贝叶斯、支持向量机等)进行分类。
二、具体例子
假设我们有下面两个简单的训练文本,每个文本都有标注的情感标签:
- 文本1:"我 喜欢 读书" —— 正面情感
 - 文本2:"我 讨厌 读书" —— 负面情感
 
1. 构建词汇表
首先,从训练数据中提取所有出现的词语。对于这两个文本,提取到的词汇有:
- "我"
 - "喜欢"
 - "讨厌"
 - "读书"
 
因此,我们可以构建词汇表(Vocabulary)为:
Vocabulary={"我","喜欢","讨厌","读书"}
2. 文本向量化
接下来,将每个文本转换为向量,每个向量的维度对应词汇表中的一个词,值为该词出现的次数。
-  
文本1:"我 喜欢 读书"
- “我”出现1次
 - “喜欢”出现1次
 - “讨厌”出现0次
 - “读书”出现1次
得到向量: 
 -  
文本2:"我 讨厌 读书"
- “我”出现1次
 - “喜欢”出现0次
 - “讨厌”出现1次
 - “读书”出现1次
得到向量: 
 
这些向量就是文本的数值化表示,它们捕获了文本中各单词的出现情况。
3. 训练分类模型
利用上述向量作为输入特征,并结合相应的情感标签(例如正面情感标记为1,负面情感标记为0),我们可以训练一个简单的分类模型。这里以逻辑回归为例:
训练步骤:
-  
准备数据:
将训练样本构建成特征矩阵 X 和标签向量 y:
其中第一行对应“我 喜欢 读书”(正面),第二行对应“我 讨厌 读书”(负面)。
 -  
模型建立:
逻辑回归模型假设预测概率为:
其中,w 是权重向量,b 是偏置项。
 -  
训练过程:
采用梯度下降等优化方法,调整 w 和 b 使得模型在训练数据上损失函数(例如交叉熵损失)最小。 -  
模型评估:
利用训练数据或独立的验证集,计算模型的预测准确率,调整超参数以获得更好的效果。 
4. 模型使用
假设训练完成后,我们得到了最优参数 w^* 和 b^*。
如何使用训练好的模型:
-  
新文本的向量化:
对于一个新文本,如“我 喜欢 电影”,首先根据之前的词汇表进行向量化:- 假设词汇表仍为 {"我","喜欢","讨厌","读书"}
 - “我”出现1次,“喜欢”出现1次,“讨厌”出现0次,“读书”出现0次,因此向量为:

 
注意:新文本中的“电影”不在词汇表中,因此在简单词袋模型中会被忽略(这也是词袋模型的一个局限)。
 -  
预测:
将新文本的向量 vnew 代入逻辑回归模型,计算:
然后通过 sigmoid 函数转换为概率:

如果该概率大于某个阈值(例如0.5),则模型预测文本为正面情感;否则预测为负面情感。
 
总结
-  
原理:
词袋模型将文本转换为不考虑词序的词频向量,通过这些向量来捕捉文本的内容信息。 -  
过程:
- 构建词汇表
 - 将文本向量化
 - 利用标注数据训练分类模型(例如逻辑回归)
 - 评估和调整模型
 
 -  
使用:
训练好的模型可用于对新文本进行向量化和情感预测,进而进行分类任务。 
这种方法虽然简单,但能有效展示如何从原始文本到数值表示,再到利用机器学习模型进行情感分类的全过程。
