前言
自然语言处理面临的文本数据往往是非结构化杂乱无章的文本数据,而机器学习算法处理的数据往往是固定长度的输入和输出。因而机器学习并不能直接处理原始的文本数据。必须把文本数据转换成数字,比如向量。
词袋模型
词袋模型(Bag-of-Words model,BOW)BoW(Bag of Words)词袋模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。如果文档中猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的。
例如三个句子如下:
句子1:小孩喜欢吃零食。 句子2:小孩喜欢玩游戏,不喜欢运动。 句子3 :大人不喜欢吃零食,喜欢运动。
首先根据语料中出现的句子分词,然后构建词袋(每一个出现的词都加进来)。计算机不认识字,只认识数字,那在计算机中怎么表示词袋模型呢?其实很简单,给每个词一个位置索引就可以了。小孩放在第一个位置,喜欢放在第二个位置,以此类推。
{“小孩”:1,“喜欢”:2,“吃”:3,“零食”:4,“玩”:5,“游戏”:6,“大人”:7,“不”:8,“运动”:9}
句子1:[1,1,1,1,0,0,0,0,0] 句子2:[1,2,0,0,1,1,0,1,1] 句子3:[0,2,1,1,0,0,1,1,1]
词袋模型的作用
- 词袋模型最重要的是构造词库,需要维护一个很大的词库。
- 词袋模型严重缺乏相似词之间的表达。
- “我喜欢北京”“我不喜欢北京”其实这两个文本是严重不相似的。但词袋模型会判为高度相似。
- “我喜欢北京”与“我爱北京”其实表达的意思是非常非常的接近的,但词袋模型不能表示“喜欢”和“爱”之间严重的相似关系。(当然词袋模型也能给这两句话很高的相似度,但是注意我想表达的含义)
- 向量稀疏
“我,喜欢” “喜欢,北京” ...
n元模型比词袋模型在某些任务上表现得更好,比如文档分类,但也会带来麻烦。
词袋模型的实现
对于中文来说,词袋模型首先会进行分词,在分词之后,通过统计每个词在文本中出现的次数,我们就可以得到该文本基于词的特征,如果将各个文本样本的这些词与对应的词频放在一起,就是我们常说的向量化。向量化完毕后一般也会使用TF-IDF进行特征的权重修正,再将特征进行标准化。 再进行一些其他的特征工程后,就可以将数据带入机器学习算法进行分类聚类了。
为了实现方便,本文使用英文来介绍怎么实现。
# 操作词袋模型: # CountVectorizer:对语料库中出现的词汇进行词频统计,相当于词袋模型。 # 操作方式:将语料库当中出现的词汇作为特征,将词汇在当前文档中出现的频率(次数)作为特征值。 import numpy as np from sklearn.feature_extraction.text import CountVectorizer count = CountVectorizer() # 语料库 docs = np.array([ "Where there is a will, there is a way.", "There is no royal road to learning.", ]) # bag是一个稀疏的矩阵。因为词袋模型就是一种稀疏的表示。 bag = count.fit_transform(docs) # 输出单词与编号的映射关系。 print(count.vocabulary_) # 调用稀疏矩阵的toarray方法,将稀疏矩阵转换为ndarray对象。 print(bag) print(bag.toarray()) # where映射为编号8 there映射为编号5······ # 编号也是bag.toarray转换来的ndarray数组的索引
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226474.html原文链接:https://javaforall.net
