提交 66dffdc8 编写于 作者: 东方怂天's avatar 东方怂天

Initial commit

上级
from keras.models import load_model
from keras.preprocessing.text import Tokenizer, text_to_word_sequence
from keras.preprocessing.sequence import pad_sequences
from keras.utils import to_categorical
import numpy as np
# 1.获取停词表
from 基础函数 import *
stopwords = getStopWords()
# 2.获取文本类型的函数
def GetType(input="华侨华人蓝皮书"):
tokenizer = Tokenizer()
# 2.1加载模型
model = load_model('训练模型/侨情.侨情')
# 以下的命名我随意命名的、大家看看就好
# 2.2定义空列表存放用于获取类型的输入单元
just4test = []
# 2.3打包成相关的data(就是我在LSTM生成的时候提到的序列化东东)
just4test.append(Just_text(input))
tokenizer.fit_on_texts(just4test)
just1sequences = tokenizer.texts_to_sequences(just4test)
just1data = pad_sequences(just1sequences, maxlen=MAX_SEQUENCE_LENGTH)
just1labels = to_categorical(np.asarray([0, 0]))
just1x_test = just1data
# 2.4预测类型、相似度比较(我在LSTM生成里面也说到了、就在最后一行)
y_predict = model.predict(just1x_test, batch_size=128, verbose=1)
# 2.5获取类别的索引
maxindex = np.argmax(y_predict)
# 2.6返回相应类别
return TypeTable[maxindex]
# 引入包
from keras.models import Sequential
from keras.models import load_model
from keras.layers import LSTM, Embedding, GRU
from keras.layers import Dense, Input, Flatten, Dropout
from keras.utils import to_categorical
from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.text import Tokenizer, text_to_word_sequence
import random
import jieba
import pandas as pd
import numpy as np
# 这里会有一些预设变量,我存在了基础函数里面,会在第3点用到
# 预定义变量,此处方便观看
# MAX_SEQUENCE_LENGTH = 100 # 最大序列长度
# EMBEDDING_DIM = 200 # embdding 维度
# VALIDATION_SPLIT = 0.16 # 验证集比例
# TEST_SPLIT = 0.2 # 测试集比例
# 最大序列长度——pad生成data的最大数量,测试时为100,此处可以调大,使模型更可靠
# Embdding维度——我也不知道有什么用,总之越大越好
# 验证集比例——在模型训练的时候会用输入所有数据按比例划分最后一部分的数据验证模型的可靠性
# 测试集比例——此处为用于测试的,可以设置为0,则上面两项可以调大
# 获取停词表//已经卸载基础函数里面了
from 基础函数 import *
stopwords = getStopWords()
# 1.已经标注好的语料输入
# 1.1加载语料(可以按照分类加载、此处自己编写)
教育_df = pd.read_csv('训练集/教育.csv', encoding='utf-8', sep=',')
人物_df = pd.read_csv('训练集/人物.csv', encoding='utf-8', sep=',')
行政_df = pd.read_csv('训练集/行政.csv', encoding='utf-8', sep=',')
经济_df = pd.read_csv('训练集/经济.csv', encoding='utf-8', sep=',')
政策_df = pd.read_csv('训练集/政策.csv', encoding='utf-8', sep=',')
# 1.2删除语料的nan行
教育_df.dropna(inplace=True)
人物_df.dropna(inplace=True)
行政_df.dropna(inplace=True)
经济_df.dropna(inplace=True)
政策_df.dropna(inplace=True)
# 1.3转换为列表
教育 = 教育_df.values.tolist()
人物 = 人物_df.values.tolist()
行政 = 行政_df.values.tolist()
经济 = 经济_df.values.tolist()
政策 = 政策_df.values.tolist()
# 2.文本标注
# 2.1文本标注函数
def preprocess_text(content_lines, sentences, category):
# 定义分词和打标签函数preprocess_text
# 参数content_lines即为1.3转换的list
# 参数sentences是定义的空list,用来储存打标签之后的数据
# 参数category 是类型标签//可以修改成中文、当然数字可能快一点
for line in content_lines:
try:
# 此处line为一个列表,所以转换为string
segs = jieba.lcut("".join(line))
segs = [v for v in segs if not str(v).isdigit()] # 去数字
segs = list(filter(lambda x: x.strip(), segs)) # 去左右空格
segs = list(filter(lambda x: len(x) > 1, segs)) # 长度为1的字符
segs = list(
filter(lambda x: x not in stopwords, segs)) # 去掉停用词
sentences.append((" ".join(segs), category)) # 打标签
except Exception:
print(line) # 输出错误行、个人认为没用
continue
# 2.2调用函数、生成训练数据
sentences = []
preprocess_text(教育, sentences, 0)
preprocess_text(人物, sentences, 1)
preprocess_text(行政, sentences, 2)
preprocess_text(经济, sentences, 3)
preprocess_text(政策, sentences, 4)
# 2.3打散数据,生成更可靠的训练集
random.shuffle(sentences)
# 3.模型生成
# 3.1获取所有特征和对应标签
all_texts = [sentence[0] for sentence in sentences]
all_labels = [sentence[1] for sentence in sentences]
# 3.2keras的sequence模块文本序列填充
tokenizer = Tokenizer()
tokenizer.fit_on_texts(all_texts)
sequences = tokenizer.texts_to_sequences(all_texts)
word_index = tokenizer.word_index
# print('Found %s unique tokens.' % len(word_index))#小提示//可以看一下
# 下面用到了上面预设的最大长度,可以调大
data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)
labels = to_categorical(np.asarray(all_labels))
# print('Shape of data tensor:', data.shape)#小提示//可以看一下
# print('Shape of label tensor:', labels.shape)#小提示//可以看一下
# 3.2数据切分//对应前面提到的测试集比例和验证集合比例
p1 = int(len(data) * (1 - VALIDATION_SPLIT - TEST_SPLIT))
p2 = int(len(data) * (1 - TEST_SPLIT))
# 3.3训练集、验证集、测试集生成
# train为训练集
x_train = data[:p1]
y_train = labels[:p1]
# val为验证集
x_val = data[p1:p2]
y_val = labels[p1:p2]
# test为测试集合//按理说可以删掉、我懒
x_test = data[p2:]
y_test = labels[p2:]
# 3.4模型训练//老实说我看不懂
model = Sequential()
model.add(Embedding(len(word_index) + 1, EMBEDDING_DIM,
input_length=MAX_SEQUENCE_LENGTH))
model.add(LSTM(200, dropout=0.2, recurrent_dropout=0.2))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dense(labels.shape[1], activation='softmax'))
model.summary()
# 3.5模型编译
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['acc'])
print(model.metrics_names)
# 下面的参数epochs为训练轮数、越大越好
model.fit(x_train, y_train, validation_data=(
x_val, y_val), epochs=100, batch_size=128) # 拟合训练集和验证集、提升准确性
# 3.6保存模型
model.save('训练模型/侨情.侨情')
# 3.7模型评估
print(model.evaluate(x_test, y_test)) # 评估测试集合//其实没有用//仅供娱乐
# 下面这个才是真正的预测函数
# model.predict(经过序列化的数据集合, batch_size=128, verbose=1)
?
!
,
:
-
(
)
·
--
……
/
.
|
——
A
B
C
D
哎呀
哎哟
俺们
按照
吧哒
罢了
本着
比方
比如
鄙人
彼此
别的
别说
并且
不比
不成
不单
不但
不独
不管
不光
不过
不仅
不拘
不论
不怕
不然
不如
不特
不惟
不问
不只
朝着
趁着
除此之外
除非
除了
此间
此外
从而
但是
当着
的话
等等
叮咚
对于
多少
而况
而且
而是
而外
而言
而已
尔后
反过来
反过来说
反之
非但
非徒
否则
嘎登
刚刚
各个
各位
各种
各自
根据
故此
固然
关于
果然
果真
哈哈
何处
何况
何时
哼唷
呼哧
还是
还有
换句话说
换言之
或是
或者
极了
及其
及至
即便
即或
即令
即若
即使
几时
既然
既是
继而
加之
假如
假若
假使
鉴于
较之
接着
结果
紧接着
进而
尽管
经过
就是
就是说
具体地说
具体说来
开始
开外
可见
可是
可以
况且
来着
例如
连同
两者
另外
另一方面
慢说
漫说
每当
莫若
某个
某些
哪边
哪儿
哪个
哪里
哪年
哪怕
哪天
哪些
哪样
那边
那儿
那个
那会儿
那里
那么
那么些
那么样
那时
那些
那样
乃至
你们
宁可
宁肯
宁愿
啪达
旁人
凭借
其次
其二
其他
其它
其一
其余
其中
起见
起见
岂但
恰恰相反
前后
前者
然而
然后
然则
人家
任何
任凭
如此
如果
如何
如其
如若
如上所述
若非
若是
上下
尚且
设若
设使
甚而
甚么
甚至
省得
时候
十分
什么
什么样
使得
是的
首先
谁知
顺着
似的
虽然
虽说
虽则
随着
所以
他们
他人
它们
她们
倘或
倘然
倘若
倘使
通过
同时
万一
为何
为了
为什么
为着
嗡嗡
我们
呜呼
乌乎
无论
无宁
毋宁
相对而言
向着
沿
沿着
要不
要不然
要不是
要么
要是
也罢
也好
一一
———
一般
一边
一会儿
一旦
一定
一点点
一方面
一面
一来
一起
一切
一下
一下子
一样
一些
一则
一直
依照
以便
以及
以免
以至
以至于
以致
抑或
因此
因而
因为
由此可见
由于
有的
有关
有些
于是
于是乎
与此同时
与否
与其
越是
云云
再说
再者
在下
咱们
怎么
怎么办
怎么样
怎样
照着
这边
这儿