词向量构造 - 词袋模型

对于机器学习任务而言,不管是什么类型的数据(语言,声音,图像,视频),都必须转化为数值型数据,一般均为向量或者矩阵。自然语言处理,经过了一个长期的发展过程,近几年取得了重大的突破。自然语言处理的突破主要得益于深度学习技术(自然语言处理专用算法)的进步以及计算机算力的提升(GPU并行计算)。

这一小节,我们将介绍自然语言处理发展历史中的第一个模型 - 词袋模型。

1.词袋模型(Bag of words)的定义

词袋模型:顾名思义,就是把文章中的所有词语装入到一个袋子当中,装入袋子中的词语是没有重复的。

下面用一个小例子来解释词袋模型。

自己编一段文本,text = ['today is a sunny day', 'my mood is so beautiful', 'I want to play basketball with my friends']

由于英文中的词是天然分隔的,所以词袋的样子就长这样 bag = ['today', 'is', 'a', 'sunny', 'day', 'my', 'mood', 'so', 'beautiful', 'i', 'want', 'to', 'play', 'basketball', 'with', 'friends'],词袋中装入了所有无重复的词。真实的词袋中的词是没有顺序的,是杂乱的。

接下来,采用采用one-hot-encoding的编码方式对文本中的每句话(我们用1、2、3分别表示上述的3句话)进行编码,得到如下的结果。

today is a sunny day my mood so beautiful i want to play basketball with friends
1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1

从上面的这个表格可以看出:

1.每句话都是按照词袋中的所有词构造向量。

2.每个词下面的数字表示该词在句子中出现的次数,如0,1,2......

3.真实的词袋模型中的词向量是没有顺序的,此处是人为编造的,看着还挺有规律,其实是没有的。

补充知识:

1.词袋模型使用的one-hot-encoding编码,如果文本内容非常多,那么词向量的维度将特别大,多数位置会出现0,所以我们也称词袋模型为稀疏编码。

2. Python实现词向量编码

上面了解了词向量的基本原理,接下来就使用python语言动手实现词向量。使用python实现词向量的主要工具为sklearn工具包中的feature_extraction.text.CountVectorizer工具包,API文档地址如下:

Sklearn.feature_extraction.text

#导入工具包
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
​
#创建文本内容
text = ['The dog runs to a cat', 'the cat finds a fish in the basin', 'the bird is flying freely in the sky ']
​
#初始化词袋模型并训练文本
cv = CountVectorizer(analyzer = 'word',stop_words = 'english')
cv.fit(text)
​
#查看词袋模型中的关键词
print(cv.get_feature_names())
#此处得到的关键词为去掉停用词之后的关键词
#['basin', 'bird', 'cat', 'dog', 'finds', 'fish', 'flying', 'freely', 'runs', 'sky']
​
#查看每个词的向量
print(cv.vocabulary_)
#该字典结果中,key为关键词,value为索引
#{'dog': 3, 'runs': 8, 'cat': 2, 'finds': 4, 'fish': 5, 'basin': 0, 'bird': 1, 'flying': 6, 'freely': 7, 'sky': 9}
​
​
#将文本内容转化为向量
cv_fit = cv.transform(text)
#查看每个句子的向量
print(cv_fit.toarray())
#[[0 0 1 1 0 0 0 0 1 0]
#[1 0 1 0 1 1 0 0 0 0]
#[0 1 0 0 0 0 1 1 0 1]]
​
#将处理后文本向量化表示
pd.DataFrame(data = cv_fit.toarray(),columns = cv.get_feature_names())
word_vector.png

3. CountVectorizer工具解释说明

sklearn.feature_extraction.text.CountVectorizer(*, input='content', 
encoding='utf-8', decode_error='strict', strip_accents=None, lowercase=True, 
preprocessor=None, tokenizer=None, stop_words=None, token_pattern='(?u)\b\w\w+\b',
 ngram_range=(1, 1), analyzer='word', max_df=1.0, min_df=1, 
max_features=None, vocabulary=None, binary=False, dtype=<class 'numpy.int64'>)

参数说明引用:https://blog.csdn.net/weixin_38278334/article/details/82320307

CountVectorizer类的参数很多,分为三个处理步骤:preprocessing、tokenizing、n-grams generation.

一般要设置的参数是:ngram_range,max_df,min_df,max_features等,具体情况具体分析

参数表 作用
input 一般使用默认即可,可以设置为"filename’或’file’
encodeing 使用默认的utf-8即可,分析器将会以utf-8解码raw document
decode_error 默认为strict,遇到不能解码的字符将报UnicodeDecodeError错误,设为ignore将会忽略解码错误,还可以设为replace,作用尚不明确
strip_accents 默认为None,可设为ascii或unicode,将使用ascii或unicode编码在预处理步骤去除raw document中的重音符号
analyzer 一般使用默认,可设置为string类型,如’word’, ‘char’, ‘char_wb’,还可设置为callable类型,比如函数是一个callable类型
preprocessor 设为None或callable类型
tokenizer 设为None或callable类型
ngram_range 词组切分的长度范围
stop_words 设置停用词,设为english将使用内置的英语停用词,设为一个list可自定义停用词,设为None不使用停用词,设为None且max_df∈[0.7, 1.0)将自动根据当前的语料库建立停用词表
lowercase 将所有字符变成小写
token_pattern 过滤规则,表示token的正则表达式,需要设置analyzer == ‘word’,默认的正则表达式选择2个及以上的字母或数字作为token,标点符号默认当作token分隔符,而不会被当作token
max_df 可以设置为范围在[0.0 1.0]的float,也可以设置为没有范围限制的int,默认为1.0。这个参数的作用是作为一个阈值,当构造语料库的关键词集的时候,如果某个词的document frequence大于max_df,这个词不会被当作关键词。如果这个参数是float,则表示词出现的次数与语料库文档数的百分比,如果是int,则表示词出现的次数。如果参数中已经给定了vocabulary,则这个参数无效
min_df 类似于max_df,不同之处在于如果某个词的document frequence小于min_df,则这个词不会被当作关键词
max_features 默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集
vocabulary 默认为None,自动从输入文档中构建关键词集,也可以是一个字典或可迭代对象?
binary 默认为False,一个关键词在一篇文档中可能出现n次,如果binary=True,非零的n将全部置为1,这对需要布尔值输入的离散概率模型的有用的
dtype 使用CountVectorizer类的fit_transform()或transform()将得到一个文档词频矩阵,dtype可以设置这个矩阵的数值类型
属性表 作用
vocabulary_ 词汇表;字典型
get_feature_names() 所有文本的词汇;列表型
stop_words_ 返回停用词表
方法表 作用
fit_transform(X) 拟合模型,并返回文本矩阵
fit(raw_documents[, y]) Learn a vocabulary dictionary of all tokens in the raw documents.
fit_transform(raw_documents[, y]) Learn the vocabulary dictionary and return term-document matrix.
  • 用数据输入形式为列表,列表元素为代表文章的字符串,一个字符串代表一篇文章,字符串是已经分割好的。CountVectorizer同样适用于中文;

  • CountVectorizer是通过fit_transform函数将文本中的词语转换为词频矩阵,矩阵元素a[i] [j]表示j词在第i个文本下的词频。即各个词语出现的次数,通过get_feature_names()可看到所有文本的关键字,通过toarray()可看到词频矩阵的结果。

4.词袋模型小结

1.词袋模型只关注词在句子中出现的频率,不关注词的位置和词与词之间的联系,所以说词袋模型是没有灵魂的词向量构造模型。

2.词袋模型是最早的自然语言处理模型,将真实世界中的语言通过计数的方式,转化为了数学符号,使得计算机可以理解。从目前来看,词袋模型已经很少使用了,但词袋模型的思想仍然是值得我们学习的。

3.对于词袋模型的构造方法CountVectorizer中的重点参数(analyzer,stop_words,n_grame,max_df,max_features等)要深入理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350