文本表示方法

文本表示方法简介

文本表示是自然语言处理(NLP)中的核心步骤,将文本数据转换为计算机可处理的数值形式,以便用于机器学习或深度学习模型。文本表示方法直接影响模型的性能和任务效果。本教程基于 2025 年 10 月的最新技术和 Python 生态(Python 3.10+),介绍常见的文本表示方法、优缺点、应用场景和代码示例,适合初学者和中级开发者。


1. 文本表示方法概述

文本表示的目的是将非结构化的文本(如单词、句子)转换为结构化的数值向量,保留语义、语法或上下文信息。常见方法分为以下几类:

  • 传统方法:基于词频或统计的表示(如 Bag of Words、TF-IDF)。
  • 词嵌入:基于神经网络的密集向量表示(如 Word2Vec、GloVe)。
  • 上下文嵌入:基于 Transformer 的动态表示(如 BERT、GPT)。
  • 子词表示:处理未登录词(如 BPE、WordPiece)。

2. 常用工具

以下是 2025 年主流的 Python 库,用于文本表示:

  • scikit-learn:实现 Bag of Words 和 TF-IDF。
  • Gensim:支持 Word2Vec、FastText 等词嵌入。
  • Transformers (Hugging Face):提供 BERT、RoBERTa 等预训练模型。
  • NLTK/spaCy:辅助分词和预处理。
  • Sentence Transformers:生成句子级嵌入。

安装命令

pip install scikit-learn gensim transformers sentence-transformers nltk spacy
python -m spacy download en_core_web_sm

3. 文本表示方法详解

3.1 Bag of Words (BoW)

  • 原理:将文本表示为词频向量,忽略词序和语法。
  • 优点:简单,适合小规模任务(如文本分类)。
  • 缺点:维度高(稀疏矩阵),丢失语序和语义。
  • 应用:关键词提取、简单分类。

示例代码

from sklearn.feature_extraction.text import CountVectorizer

texts = [
“Apple launches new iPhone in San Francisco.”,
“Samsung introduces Galaxy in New York.”
]
vectorizer = CountVectorizer()
bow_matrix = vectorizer.fit_transform(texts)
print(“词汇表:”, vectorizer.get_feature_names_out())
print(“BoW 矩阵:\n”, bow_matrix.toarray())

输出示例

词汇表: ['apple' 'francisco' 'galaxy' 'in' 'introduces' 'iphone' 'launches' 'new' 'samsung' 'york']
BoW 矩阵:
[[1 1 0 1 0 1 1 1 0 0]
 [0 0 1 1 1 0 0 1 1 1]]

说明:每个文本转为词汇表大小的向量,值表示词频。

3.2 TF-IDF(Term Frequency-Inverse Document Frequency)

  • 原理:根据词频和文档频率加权,突出重要词,抑制常见词。
  • 优点:考虑词的区分度,优于 BoW。
  • 缺点:仍为稀疏表示,忽略语序。
  • 应用:信息检索、文本分类。

示例代码

from sklearn.feature_extraction.text import TfidfVectorizer

texts = [
“Apple launches new iPhone in San Francisco.”,
“Samsung introduces Galaxy in New York.”
]
vectorizer = TfidfVectorizer(max_features=10)
tfidf_matrix = vectorizer.fit_transform(texts)
print(“词汇表:”, vectorizer.get_feature_names_out())
print(“TF-IDF 矩阵:\n”, tfidf_matrix.toarray())

输出示例

词汇表: ['apple' 'francisco' 'galaxy' 'in' 'introduces' 'iphone' 'launches' 'new' 'samsung' 'york']
TF-IDF 矩阵:
[[0.447 0.447 0.    0.316 0.    0.447 0.447 0.316 0.    0.   ]
 [0.    0.    0.447 0.316 0.447 0.    0.    0.316 0.447 0.447]]

说明:TF-IDF 值为词的加权重要性,”in” 等常见词权重较低。

3.3 Word2Vec

  • 原理:使用神经网络将词映射到低维密集向量,捕捉语义关系(如 “king” – “man” + “woman” ≈ “queen”)。
  • 优点:语义丰富,维度低(通常 100-300)。
  • 缺点:静态表示,忽略上下文。
  • 应用:词相似度、文本分类。

示例代码(使用 Gensim):

from gensim.models import Word2Vec
from nltk.tokenize import word_tokenize
import nltk
nltk.download(‘punkt’)

texts = [
“Apple launches new iPhone in San Francisco.”,
“Samsung introduces Galaxy in New York.”
]
tokenized_texts = [word_tokenize(text.lower()) for text in texts]

训练 Word2Vec

model = Word2Vec(sentences=tokenized_texts, vector_size=100, window=5, min_count=1, workers=4)
print(“Apple 向量:”, model.wv[‘apple’][:5]) # 显示前 5 维
print(“与 ‘apple’ 相似的词:”, model.wv.most_similar(‘apple’, topn=3))

输出示例(向量随机初始化,实际结果因训练数据而异):

Apple 向量: [ 0.123 -0.456  0.789 -0.234  0.567]
与 'apple' 相似的词: [('iphone', 0.85), ('francisco', 0.72), ('launches', 0.65)]

说明:需大量数据训练,实际应用可加载预训练模型(如 Google News Word2Vec)。

3.4 BERT(上下文嵌入)

  • 原理:基于 Transformer 的预训练模型,生成上下文相关的词/句子嵌入。
  • 优点:捕捉语序和上下文,性能优异。
  • 缺点:计算复杂,需 GPU 加速。
  • 应用:情感分析、问答、翻译。

示例代码(使用 Sentence Transformers):

from sentence_transformers import SentenceTransformer

加载预训练模型

model = SentenceTransformer(‘all-MiniLM-L6-v2’)

编码句子

texts = [
“Apple launches new iPhone in San Francisco.”,
“Samsung introduces Galaxy in New York.”
]
embeddings = model.encode(texts)
print(“句子嵌入形状:”, embeddings.shape)
print(“第一个句子嵌入(前 5 维):”, embeddings[0][:5])

输出示例

句子嵌入形状: (2, 384)
第一个句子嵌入(前 5 维): [ 0.123 -0.456  0.789 -0.234  0.567]

说明

  • Sentence Transformers:轻量 BERT 变体,生成 384 维句子嵌入。
  • 用途:句子相似度、语义搜索。

4. 文本表示方法的比较

方法类型优点缺点适用场景
BoW稀疏简单、计算快高维、丢失语序小型分类任务
TF-IDF稀疏突出重要词忽略语序信息检索、分类
Word2Vec密集语义丰富、低维静态、需大量数据词相似度、预训练
BERT密集上下文相关、性能强计算复杂复杂任务(如问答)

5. 性能优化技巧

  • 稀疏表示(BoW/TF-IDF)
  • 限制词汇表大小:max_features=5000
  • 使用 scipy 的稀疏矩阵存储。
  • 词嵌入(Word2Vec)
  • 加载预训练模型(如 gensim.downloader.load('word2vec-google-news-300'))。
  • 减少向量维度(e.g., 100 而非 300)。
  • BERT
  • 使用轻量模型(如 DistilBERT、MiniLM)。
  • 批量推理:model.encode(texts, batch_size=32)
  • GPU 加速:确保 PyTorch/TensorFlow 支持 CUDA。
  • 缓存:保存预处理结果(如 pickle 序列化 embeddings)。

6. 注意事项

  • 任务适配
  • 简单任务:用 BoW/TF-IDF。
  • 语义任务:用 BERT 或 Sentence Transformers。
  • 语言支持
  • 英文:Word2Vec、BERT 有丰富预训练模型。
  • 中文:使用 bert-base-chinesehfl/chinese-roberta-wwm-ext
  • 数据规模
  • 小数据集:TF-IDF 或预训练嵌入。
  • 大数据集:微调 BERT 或训练 Word2Vec。

7. 进阶学习建议

  • 子词表示:学习 BPE(Byte Pair Encoding)或 WordPiece(如 Transformers 的分词器)。
  • 多模态:结合图像(如 CLIP,OpenCV 提取特征)与文本表示。
  • 定制模型:微调 BERT(参考 Hugging Face 教程)。
  • 资源
  • Hugging Face 文档:BERT 指南。
  • Gensim 文档:Word2Vec 教程。
  • CSDN 文本表示:中文案例。

如果你需要针对特定任务(如中文分类、句子相似度计算)或更复杂的实现(如多语言嵌入),请告诉我,我可以提供详细代码和指导!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注