基于深度神经网路的文本分类 基于主流的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)

 本科毕设 word2vec 加lstm 文本分类_数据

# 数据分割 
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))

本科毕设 word2vec 加lstm 文本分类_加载_02