美文网首页
Task4 文本表示:从one-hot到word2vec

Task4 文本表示:从one-hot到word2vec

作者: _一杯凉白开 | 来源:发表于2019-05-18 21:03 被阅读0次

任务:

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

词袋模型

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

当我们要对一篇文章进行特征化,最常见的方式就是词袋,利用sklearn实践词袋模型:


from sklearn.feature_extraction.text import CountVectorizer

corpus = ['This is the first document.',
        'This is the second second document.',
        'And the third one.',
        'Is this the first document?']

# 实例化分词对象
vectorizer = CountVectorizer(min_df=1)
# 将文本进行词袋处理
X = vectorizer.fit_transform(corpus)
# 获取对应的特征名称
print(vectorizer.get_feature_names())
# 词袋化
corpus_X = X.toarray()

当使用现有的词袋特征对其他文本进行特征提取时,可利用词袋的特征空间,在针对其它文本进行词袋处理时,,直接使用现有的词汇表:

# 定义词袋的特征空间,便于使用现有的词袋的特征,对其他文本进行特征提取
vocabulary = vectorizer.vocabulary_
# 使用现有的词汇表对其他文本进行词袋处理
new_vectorizer = CountVectorizer(min_df=1, vocabulary=vocabulary)

Word2Vec

word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包;
word2vec是用来生成词向量的工具,而词向量与语言模型有着密切的关系

  1. 原理知识
    • sigmoid函数
    • 逻辑回归
    • Bayes 公式
    • Huffman 编码
      • Huffman 树
      • Huffman 树的构造
      • Huffman 编码

预备知识原理参考链接:https://blog.csdn.net/itplus/article/details/37969635

  • 统计语言模型

统计语言模型用来计算一个句子的概率的概率模型,通常基于一个语料库来构建,假设W=w_1^T := (W_1, W_2, ...,w_T)表示由T个词W_1, W_2, ...,w_T按顺序构成的一个句子,则 W_1, W_2, ...,w_T的联合概率:
p(W)=p(w_1^T) = p(W_1, W_2, ...,w_T)
p(W)为这个句子的概率

  • 计算语言模型的参数
    • n-gram模型
    • 神经概率语言模型

在NLP任务中,机器无法理解文字的含义,首先需要做的就是将语言数学化——词向量,其中one-hot是一种最简单的词向量
但是one-hot存在缺点,容易受到维度灾难的困扰,尤其当用在Deep Learning场景时;one-hot还不能很好的刻画词与词之间的相似性。

背景原理知识参考链接:https://blog.csdn.net/itplus/article/details/37969817

  1. word2vec中用到的两个重要模型

CBOW模型,Skip-gram模型

CBOW-Skip-gram网络结构
其中w(t)代表当前词语位于句子的位置t

CBOW-Skip-gram模型原理参考链接:https://blog.csdn.net/itplus/article/details/37969979
https://blog.csdn.net/itplus/article/details/37998797

  • word2vec实践:利用gensim实现
    • 第一步:获得数据,建立语料库
    • 第二步:分词
    • 第三步:训练
    • 第四步:查看效果
      选择《人民的名义》的小说原文作为语料,原文链接:这里
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat May 18 19:53:52 2019

@author: leo
"""

import jieba
import jieba.analyse
from gensim.models import word2vec

# 读数据
def get_file(path):
    with open(path) as f:
        document = f.read()
        
    return document.replace('\n','').replace('\t','').replace('\r','').replace(' ','').replace(' ','')

data = get_file('/Users/leo/Desktop/in_the_name_of_people.txt')

# 加入人名
jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田国富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('钟小艾', True)
jieba.suggest_freq('陈岩石', True)
jieba.suggest_freq('欧阳菁', True)
jieba.suggest_freq('易学习', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孙连城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁义珍', True)
jieba.suggest_freq('郑西坡', True)
jieba.suggest_freq('赵东来', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('赵瑞龙', True)
jieba.suggest_freq('林华华', True)
jieba.suggest_freq('陆亦可', True)
jieba.suggest_freq('刘新建', True)
jieba.suggest_freq('刘庆祝', True)
# 分词
data_cut = list(jieba.cut(data))

model = word2vec.Word2Vec([data_cut], hs=1, min_count=1, window=3, size=100)

# 找出沙瑞金最相近的5个词
req_count = 5
for key in model.wv.similar_by_word('丁义珍', topn = 100):
    if len(key[0]) == 3:
        if req_count == 0:
            break
        req_count -= 1
        print(key[0], key[1])
           
# 查看两个词向量相似程度
print(model.wv.similarity('沙瑞金', '高育良'))

存在问题:
jiebe.cut为全模式分词时,此时输出的精确度中不存在人名

全模式分词后word2vec结果

相关文章

网友评论

      本文标题:Task4 文本表示:从one-hot到word2vec

      本文链接:https://www.haomeiwen.com/subject/fnvnaqtx.html