任务:
- 词袋模型:离散、高维、稀疏;
- 分布式表示:连续、低维、稠密。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是用来生成词向量的工具,而词向量与语言模型有着密切的关系
- 原理知识
- sigmoid函数
- 逻辑回归
- Bayes 公式
- Huffman 编码
- Huffman 树
- Huffman 树的构造
- Huffman 编码
预备知识原理参考链接:https://blog.csdn.net/itplus/article/details/37969635
- 统计语言模型
统计语言模型用来计算一个句子的概率的概率模型,通常基于一个语料库来构建,假设表示由个词按顺序构成的一个句子,则 的联合概率:
则为这个句子的概率
- 计算语言模型的参数
- n-gram模型
- 神经概率语言模型
在NLP任务中,机器无法理解文字的含义,首先需要做的就是将语言数学化——词向量,其中one-hot是一种最简单的词向量
但是one-hot存在缺点,容易受到维度灾难的困扰,尤其当用在Deep Learning场景时;one-hot还不能很好的刻画词与词之间的相似性。
背景原理知识参考链接:https://blog.csdn.net/itplus/article/details/37969817
- word2vec中用到的两个重要模型
CBOW模型,Skip-gram模型
其中代表当前词语位于句子的位置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
为全模式分词时,此时输出的精确度中不存在人名