Mooreの小站

Moore的个人小站

AI之向量化

2025-04-22

(一)向量化基础

  1. 向量与矩阵

    • 向量是一维数组,分为行向量(单行)和列向量(单列)。

    • 矩阵是二维数组,由多行多列构成,可通过reshape方法改变形状,通过.T属性转置(行变列 / 列变行)。

  2. 向量化定义:将词、文本等非结构化数据转换为多维空间中的向量(点),通过向量距离计算语义相似度(如欧氏距离)。

  3. 向量化作用

    • 计算机仅识别数字,向量化是数据输入模型的必要预处理步骤。

    • 向量可高效描述多维特征(如文本的语义、图像的像素),便于矩阵运算提升计算速度。

(二)文本向量化方法

  1. 独热编码(One-Hot Encoding)

    • 原理:每个词映射为一个长向量,仅对应索引位置为 1,其余为 0。

    • 优缺点

      • 优点:唯一性强,无冲突。

      • 缺点:维度爆炸(词汇量越大,向量越长),无法体现语义关系。

  2. 词袋模型(Bag of Words, BOW)

    • 原理:忽略词序和语法,统计词在文本中的出现频率,构建词汇表,每个文本表示为词汇表的频率向量。

    • 优缺点

      • 优点:维度可控,优于独热编码。

      • 缺点:不考虑词序和语义,仅统计频率。

(三)代码实操

1. 环境准备

# 安装依赖库
pip install numpy jieba scikit-learn

2. 向量与矩阵操作(numpy)

import numpy as np

# 生成2行3列的随机整数数组(0-10)
random_matrix = np.random.randint(0, 11, size=(2, 3))
print("随机矩阵(2x3):")
print(random_matrix)

# 一维数组转二维(示例:1-7转2行3列,最后一个元素7被忽略,确保总元素数匹配)
one_dim = np.arange(1, 7)  # 生成[1,2,3,4,5,6]
two_dim = one_dim.reshape(2, 3)
print("\n一维转二维(2x3):")
print(two_dim)

# 矩阵转置(行变列)
transposed_matrix = two_dim.T
print("\n转置矩阵(3x2):")
print(transposed_matrix)

3. 文本向量化(BOW,使用 scikit-learn)

from sklearn.feature_extraction.text import CountVectorizer
import jieba

# 自定义分词函数(处理中文)
def chinese_tokenizer(text):
    return list(jieba.cut(text))  # 使用jieba分词,返回词语列表

# 示例文本(包含2个句子)
texts = [
    "苹果和梨子都是很常见的水果,我喜欢吃芒果和百香果。",
    "苹果今年推出新的手机,华为新手机拍照功能很强。"
]

# 初始化CountVectorizer,指定分词器
vectorizer = CountVectorizer(tokenizer=chinese_tokenizer)

# 拟合数据并生成特征矩阵
feature_matrix = vectorizer.fit_transform(texts)

# 获取词汇表(词到索引的映射)
vocabulary = vectorizer.vocabulary_

print("\n词汇表(词:索引):")
for word, idx in vocabulary.items():
    print(f"{word}: {idx}")

print("\n特征矩阵(BOW向量):")
print(feature_matrix.toarray())  # 转换为数组,每行对应一个文本的向量

(四)注意事项

  1. 分词工具

    • 中文分词推荐jieba,需自定义分词函数;英文可直接使用空格分词。

    • 新词需手动添加到分词器词典(如jieba.add_word("大模型")),避免分词错误。

  2. 模型选择

    • CountVectorizer是基础 BOW 工具,适合入门;实际项目中可使用预训练词向量(如 Word2Vec、BERT)提升语义表示能力。