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

【NLP】 1. 文本在计算机里的表示: One-Hot, sparse vector, bag of words

文本的表示

一段文本,或者一个词,我们如何来表示它? 我们可以通过类似字典的方式来解释它,或者通过有关联的词句来解释。 但是我们如何将自然语言输入给计算机呢? 计算机读取的是比特,而不是文字。 那么关键的一步就是将词句转换成计算机可以“理解”的数字。 接下来介绍关键技术。

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

定义
将每个词表示为一个与词表大小相同的向量,在该词对应的位置为1,其余位置为0。

示例: 假设词汇表 (Vocabulary) 是:

["cat", "dog", "fish", "bird"]

那么 "dog" 的 One-Hot 编码是:

[0, 1, 0, 0]

优缺点: ✅ 计算简单,易于理解
❌ 词与词之间没有关系(语义无法捕捉)
❌ 词表太大时,向量维度会变得极高(稀疏性问题)

1.1 稀疏向量(Sparse Vector)

  • 在之前的案例中,[0, 1, 0, 0] 是 “dog” 的one-hot 编码,1的索引是1(索引:[0,1,2,3]),那么这个时候sparse vector可以表示为(1)。

  • 那么如果"dog"出现了三次,如何表示呢? 这时可以写成[(1,3)],1代表索引,3代表频率。

  • 如果[“cat”, “dog”, “fish”, “bird”]中,"dog"出现了99次,"bird"出现了66次,那么sparse vector应该表示为[(1,99), (3,66)],用字典map可以表示为{1:99, 3:66}

1.2 one-hot vector, sparse vector 和 map的效率比较

存储大小耗时
one-hot词汇表大小O(n) - 词汇表大小
sparse vector只存储非0标记根据算法决定
map(哈希表映射)取决于数据结构,可能更加高效O(1)

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

词袋模型 (Bag-of-Words, BoW) 是 NLP 中最基础的文本表示方法之一。它忽略单词顺序,仅关注文本中词的出现次数。这种方法可以将文本转换为机器学习模型可用的数值特征。

1. 词袋模型的基本概念

BoW 模型的核心思想是:

  • 创建词汇表:从所有文档中提取唯一的词,形成一个固定大小的词汇表
  • 统计词频:对每个文档,计算词汇表中每个词的出现次数,构成特征向量。

示例

假设有两个文本:

文档1: "I love NLP and deep learning"
文档2: "NLP is amazing"

构建词汇表(假设小写处理):

["i", "love", "nlp", "and", "deep", "learning", "is", "amazing"]

然后将每个文档转换为向量:

ilovenlpanddeeplearningisamazing
文档111111100
文档200100011

词的顺序被忽略,只统计了出现次数。

2. 词袋模型的实现

可以使用 sklearn 中的 CountVectorizer 来实现 BoW:

from sklearn.feature_extraction.text import CountVectorizer

# 文档列表
corpus = ["I love NLP and deep learning", "NLP is amazing"]

# 创建 BoW 模型
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)

# 输出 BoW 特征矩阵
print(vectorizer.get_feature_names_out())  # 查看词汇表
print(X.toarray())  # 转换成数组

输出

['amazing' 'and' 'deep' 'i' 'learning' 'love' 'nlp' 'is']
[[0 1 1 1 1 1 1 0]
 [1 0 0 0 0 0 1 1]]
  • get_feature_names_out() 显示词汇表
  • X.toarray() 是 BoW 矩阵,每行对应一个文档,每列对应一个词的出现次数

http://www.kler.cn/a/589961.html

相关文章:

  • 前端解决页面请求大规模并发问题
  • Linux 如何上传本地文件以及下载文件到本地命令总结
  • CAD-随缘:CAD导出PDF 与 PDF导入成CAD
  • 猎豹移动(Cheetah Mobile)
  • LeetCode hot 100 每日一题(10)——56. 合并区间
  • 【VSCode】VSCode常用插件
  • 合成复用原则
  • 云原生函数计算:无服务器架构的基因重组
  • Flask+Vue-Router+JWT实现登录验证
  • [网络] socket编程--udp_echo_server
  • 【自学笔记】Redis基础知识点总览-持续更新
  • 在本地跑通spark环境
  • 程序化广告行业(22/89):腾讯广告业务布局与广告效果评估基础
  • 无再暴露源站!群联AI云防护IP隐匿方案+防绕过实战
  • coding ability 展开第四幕(滑动指针——巩固篇)超详细!!!!
  • 【华为OD-E卷 - 字符统计及重排 100分(python、java、c++、js、c)】
  • jmeter 循环控制器遍历列表中的数据
  • 20250317笔记本电脑在ubuntu22.04下使用acpi命令查看电池电量
  • test skills
  • 【数据分析】数据筛选与访问行列元素3