词向量转化
目录
词向量转化:让机器读懂人类语言的关键一步
一.自然语言处理(NLP)应用场景
二.什么是词向量
三.为什么需要词向量
四.词向量转化
1.目的
2.方法
五.词向量的局限性和发展
六.总结
七.代码演示(基于统计)
1.将下列代码中的texts中的内容转化为词向量
词向量转化:让机器读懂人类语言的关键一步
我们知道TF-IDF可以用于提取文章关键词,但仅适用于关键词提取,无法直接用于文本分类或理解句子含义。
在自然语言处理(NLP)领域,词向量(Word Embedding)是一项革命性的技术,它解决了计算机难以理解人类语言的核心问题。本文将深入探讨词向量的概念、原理、主流算法及其实践应用,帮助你全面理解这一 NLP 基础技术。
一.自然语言处理(NLP)应用场景
- 文本分类:区分文章类型(如新闻,政治,财经)
- 情感分析:判断评论的正负面(如好评或差评)
- 文本对话:实现问答交互(大模型支持)
- 网络平台责任:需自动检测并屏蔽攻击性评论,防止网络暴力
二.什么是词向量
词向量是将自然语言中的词语转换为数值向量的技术。简单来说,就是给每个词分配一个固定长度的数字列表,使得这些数字能够捕捉词语的语义信息。
例如,"国王" 可能被表示为 [0.2, 0.5, -0.1, 0.3, ...],而 "女王" 的向量会与 "国王" 的向量非常相似,因为它们在语义上接近。
三.为什么需要词向量
在词向量技术出现之前,计算机处理文本主要采用以下两种方式:
-
one-hot 编码:为每个词创建一个独热向量,向量长度等于词汇表大小,只有对应词的位置为 1,其余为 0。
缺点:维度灾难、无法表示语义关系、向量稀疏 -
词袋模型(Bag of Words):仅统计词的出现频率,忽略词序和语义。
缺点:丢失上下文信息、无法捕捉词语间的关联
词向量则完美解决了这些问题:
- 低维度表示,避免维度灾难
- 能够捕捉词语的语义和语法特征
- 相似的词具有相似的向量表示
- 支持向量运算,如 "国王 - 男人 + 女人≈女王"
四.词向量转化
1.目的
目的是将单词(中/英)转化为数值向量,使模型能够处理文本数据
2.方法
两种方法:
- ①基于统计:统计单词频率,根据每个特征单词在句子中出现次数转化词向量
- ②基于神经网络:训练单词特征(如含义、关联性),更先进但需深度学习基础。
五.词向量的局限性和发展
尽管词向量带来了巨大进步,但传统词向量仍有局限性:
- 静态词向量:一个词只有一个向量表示,无法处理一词多义
- 缺乏上下文感知:相同的词在不同语境下含义不同,但向量相同
为解决这些问题,近年来出现了基于预训练语言模型的动态词向量技术,如 BERT、GPT 等。这些模型能够根据上下文生成不同的词向量,更好地捕捉语言的丰富性和歧义性。
六.总结
词向量技术是自然语言处理领域的重要突破,它使得计算机能够真正 "理解" 词语的含义,为后续的复杂 NLP 任务奠定了基础。从 Word2Vec 到 BERT,词向量技术不断发展,推动着 NLP 领域的进步。
无论是从事 NLP 研究还是应用开发,深入理解词向量的原理和应用都是非常必要的。随着技术的不断发展,我们有理由相信,机器对人类语言的理解会越来越深入和精准。
七.代码演示(基于统计)
1.将下列代码中的texts中的内容转化为词向量
导入相关库
from sklearn.feature_extraction.text import CountVectorizer
texts=['dog cat fish','dog cat cat','fish bird','fish bir=d']
使用CountVectorizer类实现词向量转化:
- 参数
max_features
限制提取的单词数量。 - 参数
ngram_range
控制单词组合范围(如(1,3)
表示提取1到3个连续单词的组合)。
cv=CountVectorizer(max_features=6,ngram_range=(1,2))
训练出词库并将文本内容转化为词向量fit_transform,
cv_fit=cv.fit_transform(texts)
print(cv_fit)(0, 3) 1(0, 2) 1(0, 5) 1(0, 4) 1(1, 3) 1(1, 2) 2(1, 4) 1(2, 5) 1(2, 1) 1(3, 5) 1(3, 0) 1
打印模型词库
print(cv.get_feature_names_out())['bir' 'bird' 'cat' 'dog' 'dog cat' 'fish']
将词向量转化为词频矩阵(如"dog"出现1次、"cat"出现1次等)。
行名是第几个文本例如我们上面有4个文本就是4行
列名是词库中的单词例如'bir' 'bird' 'cat' 'dog' 'dog cat' 'fish'有六个就有六列
数组中的数字就是词库中的单词在对应的文本中出现的次数
print(cv_fit.toarray())[[0 0 1 1 1 1][0 0 2 1 1 0][0 1 0 0 0 1][1 0 0 0 0 1]]