文本表示:从one-hot到word2vec

任务:

  • 词袋模型:离散、高维、稀疏;
  • 分布式表示:连续、低维、稠密。word2vec词向量原理并实践,用来表示文本;

1. 词袋模型:

    词集模型: 单词构成的集合,集合中每个元素都只有一个;
    词袋模型:在词集的基础上,如果一个单词在文档中出现不止一次,统计其出现的次数;
    词袋在词集的基础上增加了频率的维度,词集关注的是单词是否存在,词袋增加关注了单词出现的频率;

  其python的实现:参见前面“TF-IDF”文章
2. one-hot

  中文名叫独热编码、一位有效编码。方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有其独立的寄存器位,并且任意时刻,有且仅有一个状态位是有效的。比如,手写数字识别,数字为0-9共10个,那么每个数字的one-hot编码为10位,数字i的第i位为1,其余为0,如数字2的one-hot表示为:[0,0,1,0,0,0,0,0,0,0]。

    1) one-hot在提取文本特征上的应用    

           one-hot在特征提取上属于词袋模型(bags of words)

           假设语料库有这么三段话:

          我爱中国

          爸爸妈妈爱我

          爸爸妈妈爱中国

          对语料库分词并进行编号

          1我;2爱;3爸爸;4妈妈;5中国

          对每段话用onehot提取特征向量

          则三段话由onehot表示为:

          我爱中国              -> 1,1,0,0,1

          爸爸妈妈爱我       ->1,1,1,1,0

          爸爸妈妈爱中国   ->0,1,1,1,1

2)优点

          可以将数据用onehot进行离散化,在一定程度上起到了扩充特征的作用   

3)缺点

         没有考虑词与词之间的顺序,并且假设词与词之间相互独立,得到的特征是离散稀疏的(如果365天用onehot,就是365    维,会很稀疏)

4)举例

在实际的机器学习的应用任务中,特征有时候并不总是连续值,有可能是一些分类值,如性别可分为“male”和“female”。在机器学习任务中,对于这样的特征,通常我们需要对其进行特征数字化,如下面的例子:
有如下三个特征属性:
性别:["male","female"]   # 所有可能取值,0,1  两种情况  
地区:["Europe","US","Asia"]    #0,1,2 三种情况
浏览器:["Firefox","Chrome","Safari","Internet Explorer"]  #0,1,2,3四种情况
所以样本的第一维只能是0或者1,第二维是0,1,2三种情况中的一种,第三维,是0,1,2,3四种情况中的一种。
对于某一个样本,如["male","US","Internet Explorer"],我们需要将这个分类值的特征数字化,最直接的方法,我们可以采用序列化的方式:[0,1,3]。但是这样的特征处理并不能直接放入机器学习算法中。
对上述问题,我们发现性别2维,地区3维,浏览器4维则我们进行onehot编码需要9维。对["male","US","Internet Explorer"]进行onehot编码为:[1,0,0,1,0,0,0,0,1]

下面看如何用代码实现:

1 from sklearn import preprocessing
2 oh = preprocessing.OneHotEncoder()
3 oh.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]])#四个样本
4 oh.transform([[0,1,3]]).toarray()

结果:[[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

[0,0,3]  #表示是该样本是,male Europe Internet Explorer

[1,1,0] #表示是  female,us  Firefox

[0,2,1]#表示是 male  Asia Chrome

[1,0,2] #表示是 female Europe  Safari

  参考:    https://www.cnblogs.com/NPC-assange/p/10879624.html

3.word2vec

       (1)简单介绍word2vec           

        当今互联网迅猛发展,每天都在产生大量的文本、图片、语音和视频数据,要对这些数据进行处理并从中挖掘出有价值的信 息,离不开NLP,其中统计语言模型 就是很重要的一环,它是所有NLP的基础,被广泛应用于语音识别、机器翻译、分词、词性标注和信息检索等任务。

       2013年Google开源了一款直接计算低微词向量的工具----Word2Vec,不仅能够在百万级的词典亿级数据集上高效训练,而且能够很好的度量词与词之间的相似性。

        (2)word2vec的两种重要模型原理

                1) CBOW模型

                    模型架构:
                          

                   网络结构:

                    

                  推导:

                      

                      

                           

                       

           

              

                2)Skip-gram模型

                      网络结构:  

                                

                     推导:

                              

                                           

                        

                                             

        (3)实践

                 创建模型:                  

# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
sentences = word2vec.Text8Corpus("b.txt")  # 加载语料
model = word2vec.Word2Vec(sentences, size=200)  # 默认window=5
model.save(u"c.model")

      其中b是语料库,形式为:

                

        使用模型:

# -*- coding: utf-8 -*-
from gensim.models import word2vec
import logging

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec.load(u"c.model")
y2 = model.most_similar(positive=[u"中国",u"战争"],topn=20)  # 20个最相关的
for i in y2:
    print i[0],
# 抗日战争 国人 中日战争 侵略战争 二战 国家 我国 本国 中华民族 鸦片战争 抗战 南京大屠杀 文化大革命 别国 战败国 中日 当今世界 美国 国民性 解放战争
y2 = model.most_similar(positive=[u"美国",u"战争"],topn=20)  # 20个最相关的
for i in y2:
    print i[0],
# 二战 越战 伊战 越南战争 侵略战争 内战 第二次世界大战 南北战争 国家 二次世界大战 二次大战 朝鲜战争 太平洋战争 当今世界 抗日战争 米国 独立战争 殖民主义 霸权主义 强权政治

          参考:https://www.cnblogs.com/NPC-assange/p/10879624.html

            https://www.cnblogs.com/itmorn/p/8196605.html#ct7

4. one-hot与word2vec的区别

  one-hot没有包含任何语料信息,所有的词之间的距离都是相同的。word2vec根据上下文关系定义了词的向量,关联度高的词有更近的距离。也就是说Word2vec表现力更强,更能表现数据的内在特征。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值