前言
在英文文本分类(见https://blog.csdn.net/ziyi9663/article/details/106997930)的基础上,添加了中文切词、编码、生成词向量矩阵的操作。
备注
- 基于中文酒店评论分类,分正负面评论两类,数据ChnSentiCorp_htl_all.csv,来自https://blog.csdn.net/alip39/article/details/95891321
- 使用预训练的词向量sgns.sogou.char
前置工作
先生成几个重要的变量,这几个变量计算时间挺长,计算之后保存在本地
"""
word_embeddings: 词—词向量,预下载并处理
word_index: 词—词编码,手动生成,按出现次数由多到少,从1开始编码,出现最多的词编码为1,以此类推
embedding_matrix:词向量矩阵,一行表示一个词的向量,行的顺序与词编码表的编码对应
"""
Coding!
import jieba
import pickle
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import Sequential, layers, losses, optimizers
TOTAL_WORDS = 20000
EMBEDDING_LEN = 300
data = pd.read_csv('ChnSentiCorp_htl_all.csv')
data = data.dropna(axis=0,how='any')
x = np.expand_dims(data['review'].to_list(),axis=1)
def get_word_embeddings():
"""
对下载好的词-词向量做个处理,原格式是一行一行的,每一行一个词,空格,再是词向量
:return: 字典,例:{
'中国':词向量}
"""
word_embeddings = {
}
with open('sgns.sogou.char',encoding='utf-8') as f:
lines = f.readlines()
for _,line in enumerate(lines):
# 不要第一行,第一行是词向量表的统计信息
if _ != 0:
values = line.split()
# 每一行的数据按空格分开,就变成了词和词向量
word = values[0]
# 取词
coefs = np.asarray(values[1:], dtype='float32')
# 取词向量。参与计算的tensor一般float32即可满足计算精度,有需求可以自己调节
word_embeddings[word] = coefs
return word_embeddings
stopwords = [line.strip() for line in open('cn_stopwords.txt',encoding='utf-8').readlines()]
def remove_stopwords(str):
"""
去除停用词
:param str: jieba.lcut切词后返回的列表
:return: 在输入的列表中剔除停用词
"""
sen = [i for i in str if i not in stopwords]
return sen
def get_word_index():
""