基于深度神经网路的文本分类 基于主流的lstm模型
原始的数据和中间的训练 模型 链接:https://pan.baidu.com/s/1jge-RGWc_YXvnOKxEr0pkg
提取码:u5iq
复制这段内容后打开百度网盘手机App,操作更方便哦
# -*- coding: utf-8 -*-
import pandas as pd
import gensim
import jieba
import re
import numpy as np
from sklearn.model_selection import train_test_split
from gensim.models import KeyedVectors
from gensim.scripts.glove2word2vec import glove2word2vec
import pandas as pd
import numpy as np
import torch
from torch import nn
import torch.utils.data as data
import torch.nn.functional as F
from torch import tensor
from sklearn.metrics import f1_score
from datetime import datetime
import time
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM,GRU
from keras import optimizers
import keras
# 读取数据
data=pd.read_csv('comments.txt',encoding='utf-8',sep=' ',delimiter="\t")
data.values
print(len(data.values)) #一共有4283条数据
# 数据处理 用 1代表正 0代表 负 文本的最大长度应该是 50
juzi=[]
for i in data.values:
if i[0][-2:-1]=="正":
a=[]
a.append(i[0][0:-2])
a.append(1)
juzi.append(a)
else:
b=[]
b.append(i[0][0:-2])
b.append(0)
juzi.append(b)
juzi_label=[]
for i in juzi:
juzi_label.append(i[1])
# print(juzi_label)
# 数据 用空格间隔 写入一个txt 只要有data.txt这个文件 这个代码就不需要再运行了 只需要运行一次
with open('data.txt','w') as f:
for ele in juzi:
a=re.findall(r'[\u4e00-\u9fa5]+', str(ele))
b=''
for i in a :
b=b+i
seg = jieba.lcut(b)
# print(seg)
for i in seg:
i.encode("utf-8")
f.write(str(i)+" ") # 加入空格
f.write("\n") # 加入换行符
f.close()
wrod2vec 词向量的训练
sentences = list(gensim.models.word2vec.LineSentence('sec.txt'))
w2v_model = gensim.models.Word2Vec(sentences, min_count=5,size=200,window=5)
w2v_model.save("wd2.bin")
词向量的加载
wd2=gensim.models.Word2Vec.load("wd2.bin")
print(wd2)
# 读取一行句子 然后从word2vec中 提取向量组成 一个句子矩阵
def hang_vectors_label(index):
row=juzi[int(index)] #读取数据的第几行
label=row[1] # 提取标签
a=re.findall(r'[\u4e00-\u9fa5]+', str(row[0])) # 匹配出所有的汉字
b=''
for i in a :
b=b+i
seg = jieba.lcut(b) # 结巴分词
meihang_wenben_juzhen=np.zeros((50,200))
hang_labeltxt_juzhen=[]
hang_labeltxt_juzhen=[]
t=0
# print(len(seg))
for a in seg:
try:
vec = wd2[a] #从词库里面取出这些词对应的向量
# print(vec)
except KeyError: #当在词向量模型中没有这个单词的向量的时候可以设置错误跳过 然后把这个单词的向量设置为全0
vec=np.zeros((1,200))
meihang_wenben_juzhen[int(t)]=vec
if t==49:
break
t=t+1
hang_labeltxt_juzhen.append(label)
hang_labeltxt_juzhen.append(meihang_wenben_juzhen)
return hang_labeltxt_juzhen
# 形成 x 和 y数据
train_x=[]
train_y=[]
e=0
for i in range(4280):
a=hang_vectors_label(i)
e=e+1
train_x.append(a[1])
train_y.append(a[0])
print(np.array(train_x).shape)
print(np.array(train_y).shape)
# print(train_y)
# 数据分割
x_train,x_test,y_train,y_test = train_test_split(np.array(train_x),np.array(train_y),test_size=0.2,random_state=23)
# 0.2 表示 八份训练 2份验证
print(x_train.shape)
print(x_train[0])
print(y_train.shape)
print(y_train[0])
print(x_test.shape)
print(y_test.shape)
# 搭建模型 主要是损失函数和优化器的选择 keras 二分类最后输出了一个值 用大于 小于 0.5判断
# 分类目标是 0 1 的话
def create_model_1():
model = keras.models.Sequential([
keras.layers.LSTM(100,activation='relu', input_shape=(50,200)),
keras.layers.Dense(32,activation='relu'),# 全连接
keras.layers.Dense(1,activation='sigmoid')# 1个全链接
])
# model.compile(loss='binary_crossentropy', optimizer=op)# 分类损失函数 和优化器
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])# 主要还是优化器损失函数选择
# model.compile(loss='mean_squared_error', optimizer='adam') # 回归损失函数和优化器
return model
model1 = create_model_1()
model1.summary()
# 开始训练
model1.fit(x_train,y_train,validation_data=(x_test, y_test), epochs=25, batch_size=32,verbose=2, shuffle=True)
model1.save_weights('moxing')#模型保存
#加载模型
#引用上边的模型实例
model_jiazai_1 = create_model_1()
# 加载保存好的模型
model_jiazai_1.load_weights('moxing')
y1_pred = model_jiazai_1.predict(x_test)
y_pred=[]
for i in y1_pred:
if abs(i)>=0.5:
y_pred.append(1)
else:
y_pred.append(0)
#F1分数
Fa=f1_score(y_test, y_pred, average='macro')
print(Fa)
#准确率计算
fenshu=[]
for i in range(len(y_pred)):
if y_test[i]== y_pred[i]:
fenshu.append(1)
else:
pass
print(len(fenshu)/len(y_pred))