【文本挖掘】——文本信息化——词袋模型

  将文本信息数值化,从而便于建模。工欲善其事,必先利其器。在数据挖掘中,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。因此文档信息向量化决定模型的高度。

一、词袋模型:

1.One-hot

  在之前做纯数据挖掘时,我记得它叫独热编码,它的基本思想时将每个特征可能取到的值单独作为一个变量,该变量出现记为1,不出现记为0.
  在文本分析中,它是一种最早用于提取文本特征的方法,也很简单,与纯数据中一样,不考虑语法和语序地把文本简化成一系列独立的词的集合,对每个词进行编码,形成字典,用0/1表示某个词是否出现,从而将文本转化为一个数学上的特征向量,便于进一步建模分析。

举个栗子:

  “狗喜欢吃骨头”:{“狗”:1,“喜欢”:2,“吃”:3,“骨头”:4}这样经过分词和编码就形成了一个特征向量。当新的句子进来时候就会依照该字典对其0/1编码:“吃骨头”:[0,0,1,1]

2. One-hot=Bag of Words词袋模型

  形象的看,文本就是一个袋子,每个词毫无顺序的扔进袋子。为减小模型复杂度,可以不考虑词频,即使用词集模型Set of Words:它只包含词的集合,不包含词出现的频数,出现则为1,不出现则为0

优缺点:优点:可处理离散数据,且相当于扩充了特征
     缺点:没有考虑词之间的顺序关系;它的假设:词之间相互独立在很多情况下是不符合实际的;造成维数灾难,扩充后的特征是稀疏的,这无疑导致维数的爆炸式增长。

3.gensim实现词袋模型

   首先安装pip install genism

1.实现过程:分词、建立字典

  Genism中的Dictionary类可实现把所有单词建立一个集合,给每个单词分配一个id号,这样就建立了一个词对Id的映射。就像是建立了一本新华字典,在后面新过来一个句子时,就去字典里查,得出每个词对应的ID和它在这个句子中出现的次数。

Dictionary的部分属性:


在这里插入图片描述

#建立字典
from gensim.corpora import Dictionary
text=[['july','可爱','傻fufu','聪明','好可爱','精致','猪猪女孩']]
dc=Dictionary(text)
print("映射关系:",dc.token2id)
print("每个词出现在几个文档中:",dc.dfs)
print("共处理的文档数量:",dc.num_docs)
print("共处理的词的数量:",dc.num_pos)
print("字典中的多少词是出现了的:",dc.num_nnz)
>>映射关系: {
    
    'july': 0, '傻fufu': 1, '可爱': 2, '好可爱': 3, '猪猪女孩': 4, '精致': 5, '聪明': 6}
  每个词出现在几个文档中: {
    
    0: 1, 2: 1, 1: 1, 6: 1, 3: 1, 5: 1, 4: 1}
  共处理的文档数量: 1
  共处理的词的数量: 7
  字典中的多少词是出现了的: 7

  其中Text是一个list of list
2.增加新词

利用add_documents()函数实现:

dc.add_documents([["姑娘","大方"],["学霸"]])
dc.token2id
>>{
    
    'july': 0,
 '傻fufu': 1,
 '可爱': 2,
 '好可爱': 3,
 '猪猪女孩': 4,
 '精致': 5,
 '聪明': 6,
 '大方': 7,
 '姑娘': 8,
 '学霸': 9}

可以看到新加入的词已经被赋予了id,原本有的词的Id未改变。

3.稀疏向量格式转换

  如果文档要转换为BOW格式稀疏向量。若字典里有1000个词,但我要转换的文本只包含5个词,那么转换出来的向量必然是包含很多0,即稀疏的。而转换为BOW稀疏向量格式,则只会输出出现了的词的id和其频次。

dc.doc2bow(['july','是','个','可爱','的','姑娘'],allow_update=True,return_missing=True)
>>([(0, 1), (2, 1), (8, 1), (10, 1), (11, 1), (12, 1)], {
    
    '个': 1, '是': 1, '的': 1})

  其中allow_update=True表示若进行分析的词在字典中没有,那么直接将其加入字典,对字典进行更新。return_missing=True表示输出新加入字典的词。

二、文档——词条矩阵

  生成文档——词条矩阵是要进行后续建模分析的必经之路,这里有sklearn给出的现成的包啦~

sklearn实现方式:CountVectorizer
  注意:min_df/max_df是分词后要保留在矩阵中的最大、最小 指定词频或百分比,不是词条的长度。若指定值为[5,10]那么如果有超过10个或小于5个词条包含该文档,则他会被剔除。若指定值为[0,0.05]那么如果小于百分之五的出现了该词条,则它被剔除。

from sklearn.feature_extraction.text import  CountVectorizer
countvec=CountVectorizer(min_df=1)
m=countvec.fit_transform(['july 是 个 可爱 的 姑娘','精致','july 是 精致女孩'])
print('每列对应词条:',countvec.get_feature_names())
print('词条字典:',countvec.vocabulary_)
print('标准格式矩阵:',m.todense())
>>每列对应词条: ['july', '可爱', '姑娘', '精致', '精致女孩']
  词条字典:    {
    
    'july': 0, '可爱': 1, '姑娘': 2, '精致': 3, '精致女孩': 4}
  标准格式矩阵: [[1 1 1 0 0]
                [0 0 0 1 0]
                [1 0 0 0 1]]

猜你喜欢

转载自blog.csdn.net/m0_46568930/article/details/111349056