NLP:Task2 文本表示:从one-hot到word2vec – Python量化投资

NLP:Task2 文本表示:从one-hot到word2vec

  • 学习词袋模型概念:离散、高维、稀疏。

  • 学习分布式表示概念:连续、低维、稠密。

  • 理解word2vec词向量原理并实践,来表示文本。

  • word2vec 中的数学原理详解 word2vec1

  • word2vec原理推导与代码分析 word2vec2


  • 词袋模型:离散、高维、稀疏;
  • 分布式表示:连续、低维、稠密。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 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包;
word2vec是用来生成词向量的工具,而词向量与语言模型有着密切的关系

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

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

  • 统计语言模型

统计语言模型用来计算一个句子的概率的概率模型,通常基于一个语料库来构建,假设[图片上传失败…(image-e15da2-1565352280030)]

表示由[图片上传失败…(image-92d944-1565352280030)]

个词[图片上传失败…(image-2a2525-1565352280030)]

按顺序构成的一个句子,则 [图片上传失败…(image-b8ad22-1565352280030)]

的联合概率:
[图片上传失败…(image-408339-1565352280030)]

则[图片上传失败…(image-c8b311-1565352280029)]

为这个句子的概率

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

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

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

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

CBOW模型,Skip-gram模型

其中[图片上传失败…(image-245f6c-1565352280030)]

代表当前词语位于句子的位置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为全模式分词时,此时输出的精确度中不存在人名

https://www.jianshu.com/p/cacd11ae7205

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论