1 TensorFlow使用

分析流程:

1.1  使用gensim加载预训练中文分词embedding

加载预训练词向量模型:https://github.com/Embedding/Chinese-Word-Vectors/

from gensim.models import KeyedVectors
cn_model = KeyedVectors.load_word2vec_format('H:/词向量/word+Ngram/sgns.zhihu.bigram', binary=False)

查看词语的向量模型表示: 维度为300

词语相似度:向量余弦值

最相似的词:

1.2 训练样本预料

  准备一个训练集,4000个酒店评论,其中2000条为pos积极的,2000条为消极的,每条评论放在一个文件中。

1)文本预处理,分词、索引化

读取数据

import os
import re import jieba
from gensim.models import KeyedVectors cn_model = KeyedVectors.load_word2vec_format('H:/word+Ngram/sgns.zhihu.bigram', binary=False) baseDir = "H:/谭松波老师8++酒店评论++语料/utf-8/4000"
pos_txts = os.listdir("H:/谭松波老师8++酒店评论++语料/utf-8/4000/pos")
neg_txts = os.listdir("H:/bishe/NLP/训练集/谭松波老师8++酒店评论++语料/utf-8/4000/neg") train_text_orig = [] for i in range(len(pos_txts)):
with open(baseDir+"/pos/"+pos_txts[i], errors="ignore", encoding="utf-8") as f:
text = f.read().strip()
train_text_orig.append(text)
f.close()
for i in range(len(neg_txts)):
with open(baseDir+"/neg/"+neg_txts[i], errors="ignore", encoding="utf-8") as f:
text = f.read().strip()
train_text_orig.append(text)
f.close()

分词,建立索引:

# [[句子词索引],[]]
train_tokens = []
for text in train_text_orig:
# 去掉标点符号
text = re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+", "", text)
# 结巴分词
cut = jieba.cut(text)
# 结巴分词结果为一个生成器
cut_list = [i for i in cut]
for i, word in enumerate(cut_list):
try:
# 将词转换成索引
cut_list[i] = cn_model.vocab[word].index
except KeyError:
cut_list[i] = 0
train_tokens.append(cut_list)

2)文本长度标准化:

长度参差不齐,我们需要将长度标准化,方便模型进行训练,如果长度太短,会损失太多的信息,而长度太长会浪费太多计算资源
所以说我们要取一个这种的方案,让这个长度基本上涵盖所有的训练样本,又不损失太多的信息

样本长度分布图:

# 看一下样本长度分布图
import matplotlib.pyplot as plt plt.hist(num_tokens, bins=100)
plt.xlim(0, 400)
plt.ylabel("number of tokens")
plt.xlabel("length of tokens")
plt.title("Distribution of tokens length")
plt.show()

# 取tokens平均值加上两个tokens的标准差
# 假设tokens长度的分布符合正太分布,则max_tokens这个值可以涵盖95%左右的样本
max_tokens = np.mean(num_tokens) + 2 * np.std(num_tokens)
# 取tokens的长度为236时,大约95%左右的样本被涵盖
# 对于长度不足的进行padding,过长的进行修剪
np.sum(num_tokens<max_tokens)/len(num_tokens)

反tokenize

def reverse_token(tokens):
'''
将索引化的句子还原
:param tokens: 句子 [词语,..]
:return:
'''
text = ""
for i in tokens:
if i!=0:
text = text+cn_model.index2word[i]
else:
text =text+" "
return text

3)准备Emdedding Matrix(词向量矩阵)

根据Keras的要求,我们需要准一个维度为(numwords, embeddingdim)的矩阵,num words代表我们使用的词汇的数量,emdedding dimension在我们预训练词向量模型中是300,每个词汇都用长度为300的向量表示(例如: 较好 ->[  0.056964, -0.127308, -0.118041,...]),注意词向量矩阵是作为训练模型的工具,

# 初始化词向量矩阵-embedding matrix(只用前50000个词)
num_words = 50000
embedding_matrix = np.zeros((num_words, embedding_dim))
# 维度为(50000, 300)的矩阵
for i in range(num_words):
embedding_matrix[i,:]=cn_model[cn_model.index2word[i]] # 将词向量赋值到词向量矩阵中
embedding_matrix = embedding_matrix.astype("float32") # 检查赋值是否正确
np.sum(cn_model[cn_model.index2word[333]]==embedding_matrix[333])

词向量矩阵维度:

4) padding(填充)和truncating(修剪)

  我们把问转换成token(索引)后,每一串索引的长度都不相等,所以为了方便模型的训练我们需要将索引的长度标准化,上面我们选择了使用236这个可以涵盖95%的训练样本的长度,接下来进行padding和truncating,我们一个采用‘pre’的方法,在文本索引的前面填充0。

# 返回一个numpy array
train_pad = pad_sequences(train_tokens, maxlen=max_tokens, padding="pre", truncating="pre")

准备目标向量:

# 准备target向量,前2000个位1,后2000个位0
train_target = np.concatenate((np.ones(2000), np.zeros(2000))) 

训练样本和测试样本分离,使用90%的样本来做训练,10%的样本用来做测试:

# 进行训练和测试样本的分割
from sklearn.model_selection import train_test_split
# 90用作训练,正面和负面打乱
X_train, X_test, y_train, y_test = train_test_split(train_pad, train_target, test_size=0.1, random_state=12)

5)使用Keras搭建神经网络模型(LSTM),模型的第一层是Embedding层

end

使用TensorFlow进行中文自然语言处理的情感分析的更多相关文章

  1. NLP之中文自然语言处理工具库:SnowNLP(情感分析/分词/自动摘要)

    一 安装与介绍 1.1 概述 SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个 ...

  2. Spark2.0 特征提取、转换、选择之二:特征选择、文本处理,以中文自然语言处理(情感分类)为例

    特征选择 RFormula RFormula是一个很方便,也很强大的Feature选择(自由组合的)工具. 输入string 进行独热编码(见下面例子country) 输入数值型转换为double(见 ...

  3. LSTM实现中文文本情感分析

    1. 背景介绍 文本情感分析是在文本分析领域的典型任务,实用价值很高.本模型是第一个上手实现的深度学习模型,目的是对深度学习做一个初步的了解,并入门深度学习在文本分析领域的应用.在进行模型的上手实现之 ...

  4. 中文情感分析——snownlp类库 源码注释及使用

    最近发现了snownlp这个库,这个类库是专门针对中文文本进行文本挖掘的. 主要功能: 中文分词(Character-Based Generative Model) 词性标注(TnT 3-gram 隐 ...

  5. TensorFlow实现文本情感分析详解

    http://c.biancheng.net/view/1938.html 前面我们介绍了如何将卷积网络应用于图像.本节将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句 ...

  6. TensorFlow文本情感分析实现

    TensorFlow文本情感分析实现 前面介绍了如何将卷积网络应用于图像.本文将把相似的想法应用于文本. 文本和图像有什么共同之处?乍一看很少.但是,如果将句子或文档表示为矩阵,则该矩阵与其中每个单元 ...

  7. 【HanLP】HanLP中文自然语言处理工具实例演练

    HanLP中文自然语言处理工具实例演练 作者:白宁超 2016年11月25日13:45:13 摘要:HanLP是hankcs个人完成一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环 ...

  8. 用python做中文自然语言预处理

    这篇博客根据中文自然语言预处理的步骤分成几个板块.以做LDA实验为例,在处理数据之前,会写一个类似于实验报告的东西,用来指导做实验,OK,举例: 一,实验数据预处理(python,结巴分词)1.对于爬 ...

  9. Tensorflow 免费中文视频教程,开源代码,免费书籍.

    Free-Tensorflow Tensorflow 免费中文视频教程,开源代码,免费书籍. 官方教程 官方介绍 https://tensorflow.google.cn/ 安装教程 https:// ...

随机推荐

  1. C语言--第0次作业;

    第零次作业 1.你对网络专业或者计算机专业了解是怎样? 在高考之前,我就确定了自己的大学专业将会选择计算机方面.我认为计算机专业就业前景比较好,计算机行业发展也非常快,学科实践与创新能力也比较强,在当 ...

  2. 201621123023《Java程序设计》第10周学习总结

    一.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 二.书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出 ...

  3. [bzoj3123] [SDOI2013]森林 主席树+启发式合并+LCT

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  4. SQLAlchemy和Flask-SQLAlchemy

    一.ORM 与 SQLAlchemy 简介 ORM 全称 Object Relational Mapping, 翻译过来叫对象关系映射.简单的说,ORM 将数据库中的表与面向对象语言中的类建立了一种对 ...

  5. AcDbTable表格实体的简单例子

    例子是创建一个含有表格实体的块定义 效果如下(手动插入的块) 源代码如下,简单示意,采用了我不是很熟悉的智能指针创建实体对象,代码仅供参考 AcDbObjectPointer<AcDbTable ...

  6. WC2019 全国模拟赛第一场 T1 题解

    由于只会T1,没法写游记,只好来写题解了... 题目链接 题目大意 给你一个数列,每次可以任取两个不相交的区间,取一次的贡献是这两个区间里所有数的最小值,求所有取法的贡献和,对 \(10^9+7\) ...

  7. setInterval(),setTimeout(),location.reload(true)

    1,setInterval() setInterval()方法可以按照指定的周期来调用函数或表达式,他会不停地调用函数,直到调用clearInterval()方法或窗口关闭.由setInterval( ...

  8. Centos搭建Groovy开发环境

    背景 临时接到需求,要帮兄弟团队跑一点线上的数据,据说很急.于是拿出了许久不用的Spring-Boot.可是,可是,死活启动有问题,心累了.其实一般写脚本就是在Boot用Groovy写好,然后放到线上 ...

  9. Lambda入门

    Lambda 来源于微积分数学中的 λ,其涵义是声明为了表达一个函数具体需要什么. Table of contents Introduction 使用 Introduction 什么是Lambda? ...

  10. random 模块常用方法学习

    >>> import random#随机小数>>> random.random() # 大于0且小于1之间的小数0.7664338663654585>> ...