目录

简介

一、词向量转换相关概念

二、算法应用

完整案例演示:词频向量化过程

1. 导入工具库(类)

2. 准备文本数据

3. 初始化向量化器(关键参数说明)

4. 拟合转换文本数据

5. 解析稀疏矩阵输出

6. 获取特征名称(词汇表)

7. 转换为稠密矩阵(直观展示)

8. 完整对照表

关键结论

三、案例分析(中文文本情感分类的前期数据处理与特征工程流程)

1.数据集

2.整体功能概述

3.代码分步详解


简介

jieba库、朴素贝叶斯算法和TF-IDF值是自然语言处理(NLP)中常用的工具和技术,各自在文本处理的不同阶段发挥作用。 在自然语言处理的世界里,如何让计算机 “读懂” 人类语言一直是核心难题,而词向量转换正是破解这一难题的关键钥匙。本次机器学习专题,我们就来深入探讨这一基础又核心的技术。词向量转换的本质,是将文本中离散的词语转化为连续的数值向量。这一步看似简单,却实现了从 “机器无法理解的文字” 到 “可计算的数字” 的跨越,为后续的文本分类、情感分析、机器翻译等任务铺平了道路。

一、词向量转换相关概念

1.为什么需要词向量转换

人类语言丰富多样,单词具有语义、语法和语境等多重信息。但计算机擅长处理数值数据,原始文本无法直接被计算机理解和分析。词向量转换通过将单词转换为数值向量,把语言信息编码成计算机能处理的形式。这样,计算机可以利用这些向量进行计算,从而挖掘文本中的有用信息,实现对文本的理解和处理。

2.词向量转换的分类

特征提取库中导入向量转化模块,自然语言转换成数据的形式,才能保证模型进行训练。

  • 1、基于统计的方法 统计每个单词在这句话中出现的次数
  • 2、基于神经网络模型训练的方法

今天讲述的是基于统计的方法进行词向量转换,第二种要利用深度学习的知识,后面再说。

二、算法应用

我们以一个小例子来说明理解词向量转换的代码过程


完整案例演示:词频向量化过程

1. 导入工具库(类)
from sklearn.feature_extraction.text import CountVectorizer

 CountVectorizer(词频向量化器)类,是用于将文本转换为词频向量的工具,详细参数如下:

CountVectorizer(
    input='content',          # 输入类型:'content'(直接文本)、'filename'(文件路径)、'file'(文件对象)
    encoding='utf-8',         # 文本编码格式
    decode_error='strict',    # 解码错误处理:'strict'(报错)、'ignore'(忽略)、'replace'(替换)
    strip_accents=None,       # 去除重音符号:None(不处理)、'ascii'(仅ASCII字符)、'unicode'(所有字符)
    lowercase=True,           # 是否将文本转为小写(默认True)
    preprocessor=None,        # 自定义预处理函数(输入文本字符串,返回处理后的字符串)
    tokenizer=None,           # 自定义分词函数(输入文本字符串,返回分词列表)
    stop_words=None,          # 停用词:None(不处理)、'english'(内置英文停用词)、自定义列表
    token_pattern=r'(?u)\b\w\w+\b',  # 分词正则表达式(默认匹配2个及以上字符的单词)
    ngram_range=(1, 1),       # 提取n元词范围,如(1,2)表示同时提取1元词和2元词
    analyzer='word',          # 分析单位:'word'(按词)、'char'(按字符)、'char_wb'(按字符,不跨越词边界)
    max_df=1.0,               # 最大文档频率(过滤高频词):0~1(比例)或整数(文档数)
    min_df=1,                 # 最小文档频率(过滤低频词):0~1(比例)或整数(文档数)
    max_features=None,        # 保留的最大特征数(按词频排序取前N个)
    vocabulary=None,          # 自定义词汇表(字典或列表,指定要提取的词)
    binary=False,             # 是否将词频转为二进制(1表示出现,0表示未出现,默认False)
    dtype=np.int64            # 输出矩阵的数据类型
)
2. 准备文本数据

定义了一个文本列表 texts ,包含 4 个字符串元素:

texts = ['apple banana orange', 'apple banana banana', 'orange pear', 'pear']
3. 初始化向量化器(关键参数说明)

创建了 CountVectorizer 实例,并设置了两个参数:

cv = CountVectorizer(
    max_features=6,    # 仅保留语料库中出现频率最高的6个特征**
    ngram_range=(1, 3) # 提取1元词(unigram)、2元词(bigram)、3元词(trigram)**
)
4. 拟合转换文本数据

cv.fit_transform(texts) 对文本进行拟合和转换:

  • fit :分析文本,构建词汇表
  • transform :将文本转换为词频矩阵【稀疏矩阵三元组】
cv_fit = cv.fit_transform(texts)  # fit构建词汇表 + transform生成矩阵
5. 解析稀疏矩阵输出

print(cv_fit) 输出的是一个稀疏矩阵三元组表示,格式为 (文档索引[行标], 特征索引[列标]) 词频

print(cv_fit)

输出结果:

  (0, 0)	1   # **文档0中特征0出现1次**
  (0, 3)	1   # **文档0中特征3出现1次**
  (0, 4)	1   # **文档0中特征4出现1次**
  (0, 1)	1   # **文档0中特征1出现1次**
  (1, 0)	1   # **文档1中特征0出现1次**
  (1, 3)	2   # **文档1中特征3出现2次**
  (1, 1)	1   # **文档1中特征1出现1次**
  (1, 2)	1   # **文档1中特征2出现1次**
  (2, 4)	1   # **文档2中特征4出现1次**
  (2, 5)	1   # **文档2中特征5出现1次**
  (3, 5)	1   # **文档3中特征5出现1次**
6. 获取特征名称(词汇表)

cv.get_feature_names_out() 返回所有提取的特征名称(词汇表),根据示例会输出类似:

feature_names = cv.get_feature_names_out()
print(feature_names)

输出结果:

['apple' 'apple banana' 'apple banana banana' 'banana' 'orange' 'pear']

说明

  • 特征顺序由算法自动生成(优先高频词,同频按字母序)

  • 包含所有1-3元词组:apple(unigram)、apple banana(bigram)、apple banana banana(trigram)等

7. 转换为稠密矩阵(直观展示)

cv_fit.toarray() 将稀疏矩阵转换为稠密矩阵(二维数组),每行代表一个文档,每列代表一个特征,值为该特征在对应文档中的出现次数:

import numpy as np
dense_matrix = cv_fit.toarray()
print(dense_matrix)

输出结果:

[[1 1 0 1 1 0]  # **文档0:apple/apple banana/banana/orange各1次**
 [1 1 1 2 0 0]  # **文档1:apple/apple banana/apple banana banana/banana(2次)**
 [0 0 0 0 1 1]  # **文档2:orange/pear各1次**
 [0 0 0 0 0 1]] # **文档3:pear 1次**
8. 完整对照表

文本内容

apple

apple banana

apple banana banana

banana

orange

pear

apple banana orange

1

1

0

1

1

0

apple banana banana

1

1

1

2

0

0

orange pear

0

0

0

0

1

1

pear

0

0

0

0

0

1


关键结论

  1. 特征生成逻辑

    ngram_range=(1,3)会生成所有连续1-3个词的组合(如"apple banana"是bigram,"apple banana banana"是trigram)。

  2. 特征筛选机制

    max_features=6强制只保留语料库中出现频率最高的6个特征(本例中为:apple, apple banana, apple banana banana, banana, orange, pear)。

  3. 矩阵解读

    • 行:文档索引(0~3对应4个文本)

    • 列:特征索引(0~5对应6个特征)

    • 值:特征在文档中的出现次数(非布尔值)

:实际特征顺序可能因sklearn版本差异而不同,但矩阵数值关系保持不变。可通过get_feature_names_out()验证具体映射关系。

三、案例分析(中文文本情感分类的前期数据处理与特征工程流程

这里有从苏宁上爬取的关于手机的评论,一个好评与一个差评文件

1.数据集

差评

好评

2.整体功能概述

这段代码主要实现了 中文文本情感分类的前期数据处理与特征工程流程 ,包括:

  1. 读取好评、差评文本数据;
  2. 用 jieba 进行中文分词;
  3. 去除停用词(高频无意义词汇,如 “的”“了” 等 );
  4. 构建带标签的训练数据集;
  5. 拆分训练集、测试集;
  6. 用 CountVectorizer(词频向量化器) 将分词后的文本转换为词频特征矩阵,为后续机器学习模型(如分类器)做准备。
3.代码分步详解

1.库与模块导入

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
import jieba
  • CountVectorizer :用于将文本转换为词频矩阵(scikit-learn 工具);
  • pandas (别名 pd ):处理表格型数据(读取文件、DataFrame 操作);
  • jieba :中文分词库,把连续的中文文本拆分为词语列表。

2. 读取原始数据

hp_content = pd.read_table("好评.txt", encoding='gbk')
cp_content = pd.read_table("差评.txt", encoding='gbk')
  • 用 pd.read_table 读取本地文本文件, encoding='gbk' 适配 GBK 编码(需确保文件实际编码一致,否则会报错 );
  • pd.read_table是 pandas 库中用于读取分隔符分隔文本文件(如 TSV、CSV 等)的核心函数,本质是将表格型文本数据加载为 pandas DataFrame。它默认以制表符(\t)​ 作为分隔符,是 pd.read_csv的“兄弟函数”(read_csv默认以逗号 ,分隔)。
  • hp_content 、 cp_content 是 DataFrame 类型,存储 “好评”“差评” 文本数据,默认有一列 content 存文本内容。

3.中文分词(差评 + 好评)

差评分词 

cp_segements = []
contents = cp_content.content.values.tolist()
for content in contents:
    results = jieba.lcut(content)  # 精确模式分词,返回词语列表
    if len(results) > 1:  # 过滤分词后长度<1的(避免空内容)
        cp_segements.append(results)

cp_fc_results = pd.DataFrame({'content': cp_segements})
cp_fc_results.to_excel('cp_fc_results.xlsx', index=False)
  • 先提取 cp_content 中 content 列的文本,转成列表遍历;
  • jieba.lcut(content) 对单条文本分词,结果是 list (如 “这个产品好” → ["这个", "产品", "好"] );
  • 用 DataFrame 存储分词结果,再导出为 Excel( index=False 不存行索引 )。

好评分词 (逻辑与差评完全一致 ):

hp_segements = []
contents = hp_content.content.values.tolist()
for content in contents:
    results = jieba.lcut(content)
    if len(results) > 1:
        hp_segements.append(results)

hp_fc_results = pd.DataFrame({'content': hp_segements})
hp_fc_results.to_excel('hp_fc_results.xlsx', index=False)

4. 读取停用词

stopwords = pd.read_csv(
    'StopwordsCN.txt',
    encoding='utf-8',
    engine='python',
    header=None,
    names=['word'],
    sep='\t'
)
  • 读取停用词表(通常是纯文本,每行一个停用词 );
  • header=None 表示文件无表头, names=['word'] 手动设列名, sep='\t' 用制表符分隔(按实际文件格式调整 );
  • 最终 stopwords 是 DataFrame ,一列 word 存停用词。

5. 定义并调用 “去除停用词” 函数

def drop_stopwords(contents, stopwords):
    segments_clean = []
    for content in contents:  # 遍历每条分词后的文本(列表套列表结构)
        line_clean = []
        for word in content:  # 遍历单条文本的词语
            if word in stopwords:  # 若词语在停用词表中,跳过
                continue
            line_clean.append(word)  # 否则保留词语
        segments_clean.append(line_clean)  # 收集单条文本清洗后的词语列表
    return segments_clean
  • 输入: contents 是分词后的文本列表(如 [["这个","产品","好"], ...] ), stopwords 是停用词列表;
  • 输出:清洗后的词语列表(过滤掉停用词 )。

调用函数处理差评、好评数据 

# 处理差评
contents = cp_fc_results.content.values.tolist()  # 从 DataFrame 提取分词结果(列表格式)
stopwords = stopwords.word.values.tolist()  # 停用词 DataFrame → 列表
cp_fc_contents_clean_s = drop_stopwords(contents, stopwords)

# 处理好评(逻辑同上)
contents = hp_fc_results.content.values.tolist()
hp_fc_contents_clean_s = drop_stopwords(contents, stopwords)

6. 构建带标签的训练数据集

cp_trian = pd.DataFrame({'segments_clean': cp_fc_contents_clean_s, 'label': 1})  # 差评标签设为 1
hp_train = pd.DataFrame({'segments_clean': hp_fc_contents_clean_s, 'label': 0})    # 好评标签设为 0
pj_train = pd.concat([cp_trian, hp_train])  # 合并差评、好评数据
pj_train.to_excel("pj_train.xlsx", index=False)  # 导出合并结果
  • label 是情感标签: 代表 “差评”, 代表 “好评”;
  • pd.concat 按行合并两个 DataFrame ,形成完整训练数据集

7. 拆分训练集、测试集

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(
    pj_train['segments_clean'].values,  # 特征:清洗后的分词列表
    pj_train['label'].values,           # 标签:情感类别(0/1)
    random_state=0
)
  • train_test_split 按默认比例(一般 75% 训练、25% 测试 )拆分数据;
  • x_train x_test 是特征数据(分词列表 ), y_train y_test 是对应标签。

8. 文本转词频特征(为模型做准备)

words = []
for line_index in range(len(x_train)):
    words.append(' '.join(x_train[line_index]))  # 分词列表 → 用空格连接成字符串(如 ["这个","产品"] → "这个 产品" )
print(words)

from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(max_features=4000, ngram_range=(1, 3))  # 初始化向量器
vec.fit(words)  # 基于训练集构建词汇表

x_train_vec = vec.transform(words)  # 训练集文本 → 词频矩阵
print("a")
  • 构建可入模的文本格式 
    CountVectorizer (词频向量化器)要求输入是 “用空格连接的字符串”,所以用 ' '.join(...) 把分词列表转成字符串(如 ["这个","产品"] → "这个 产品" )。

  • CountVectorizer 配置与作用 

    • max_features=4000 :只保留词频最高的 4000 个词(控制特征数量,避免维度爆炸 );
    • ngram_range=(1, 3) :提取 1 元词(单个词)、2 元词(两个词组合,如 “这个 产品” )、3 元词(三个词组合 );
    • vec.fit(words) :扫描 words 里的文本,统计词频并构建词汇表(后续用这个词汇表转换文本 );
    • vec.transform(words) :将训练集文本转换为 稀疏矩阵 (每行是一条文本,每列是一个词,值是词频 ),供机器学习模型(如逻辑回归、SVM )使用。

9. 模型训练与评估

# 训练朴素贝叶斯模型
classifier = MultinomialNB(alpha=0.1)  # alpha为平滑参数
classifier.fit(x_train_vec, y_train)

# 评估训练集性能
train_predict = classifier.predict(x_train_vec)
print("训练集:")
print(metrics.classification_report(y_train, train_predict))

# 评估测试集性能
test_words=[]
for line_index in range(len(x_test)):
    test_words.append(' '.join(x_test[line_index]))
test_predict = classifier.predict(vec.transform(test_words))
print("测试集:")
print(metrics.classification_report(y_test, test_predict))
  1. 使用多项式朴素贝叶斯算法训练模型(适合文本分类任务)
  2. 在训练集上评估性能(查看模型对训练数据的学习效果)
  3. 在测试集上评估性能(查看模型的泛化能力)
  4. classification_report 提供精确率、召回率、F1 分数等详细指标

10. 实际预测应用

# 接收用户输入并进行预测
s = input("请输入评价:")

# 单个文本预处理函数
def preprocess_single_text(text, stopwords):
    segments = jieba.lcut(text)  # 分词
    clean_segments = [word for word in segments if word not in stopwords]  # 去停用词
    return ' '.join(clean_segments)  # 转为字符串

processed_text = preprocess_single_text(s, stopwords_list)
s_predict = classifier.predict(vec.transform([processed_text]))  # 预测

# 输出结果
print("\n预测结果:", "好评" if s_predict[0] == 0 else "差评")
  1. 接收用户输入的评价文本
  2. 对文本进行与训练数据相同的预处理(分词、去停用词)
  3. 使用训练好的模型进行预测
  4. 输出预测结果(好评或差评)
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐