试读内容:
「基于Django的全民健康智慧中医数字服务平台」项目文章目录
「基于Django的全民健康智慧中医数字服务平台」中医问诊学习,开发原理理论基础
「基于Django的全民健康智慧中医数字服务平台 V2.0」产品设计&技术应用
如果你对中医感兴趣欢迎留言讨论,觉得我的内容对你有帮助的话,能够请我喝一杯沪上阿姨不禁万分感谢。
内容简介
基于Magpie框架深度学习的 CNN 卷积神经网络 进行的文本多分类模型全流程。
准备工作
- 数据抓取准备,将包含多类别的数据存储到Mongodb数据仓库中。
- 准备Magpie文本分类框架。
- 自然语言处理词库(停用词和不可拆分辞典)。
- Tesorflow版本gpu 1.13,不支持2.0以上版本。
基础数据处理
from bs4 import BeautifulSoup
import re
import pandas as pd
import numpy as np
import time
import datetime
import warnings
import pymongo
from urllib import parse
client = pymongo.MongoClient(host="localhost", port=27017, username=username, password=password)
db = client['EveryMonthData']
# 月份列表根据情况修改,保留当前月和上月的字段不可在其中
month_list = [
'2020-00', # 默认未抓到日期的数据统统写入到这里
'2020-01','2020-02','2020-03','2020-04','2020-05','2020-06',
'2020-07','2020-08','2020-09','2020-10','2020-11','2020-12',
'2021-01','2021-02',
]
提取 健康养生 类的数据
data = pd.DataFrame()
for month in month_list:
table = db[month]
data_append = pd.DataFrame(list(table.find({"bd_type":["健康养生"]})))
data = data.append(data_append)
提取模型训练数据类别
# 文本类别用中文显示
def clean_bd_type(text):
# 取全部类别进行训练
type_list = text[1]
type_list = "" if type_list == [] else type_list
return type_list
data["new_type_1"] = data.bd_type.apply(clean_bd_type)
重新构建数据
data.reset_index(drop=True,inplace=True)
提取模型有效数据
# 合并标题和文本数据
data["content"] = data["title"] + data["unHtmlContent"]
# 提取类别数据和新合成的文本数据
df = data[["_id","content","new_type_1"]]
# 删除内容为空的数据
df = df.dropna()
# 放弃类别为 AI未分类数据,将有效数据进行建模
df = df[df["new_type_1"] != ""]
清洗文本数据
# 判断是否为汉字
def is_chinese(uchar):
if uchar >= u'\u4e00' and uchar <= u'\u9fa5':
return True
else:
return False
# 文本格式清理,只保留中文字符
def clean_text(text):
content_str = ''
for i in text:
if is_chinese(i):
content_str = content_str + i
return content_str
df['content_new'] = df.content.apply(clean_text)
文本分词提取
import jieba
stop_words_path="data/model_stopwords.txt"
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r',encoding='utf-8').readlines()]
return stopwords
# 文本分词
def jieba_cut(text):
words= " ".join(jieba.cut(text))
words = [w for w in words if w not in stopwordslist(stop_words_path)]
return ''.join(words)
df['jieba_cut'] = df.content_new.apply(jieba_cut)
df.reset_index(drop=True,inplace=True)
生成训练数据
#生成训练集文档
#标签ID
j=0
for i in range(len(df)):
file=open('data/train_data/{}.lab'.format(df['_id'][i]),'w')
list_=df['new_type_1'][i]
str_list = [line+'\n' for line in list_]
file.writelines(set(str_list))
file.close()
j+=1
#内容ID
j=0
for i in range(len(df)):
file=open('data/train_data/{}.txt'.format(df['_id'][i]),'w')
file.write(str(df['jieba_cut'][j]))
file.close()
j+=1
把全部数据处理成这样就可以了
模型训练
magpie = Magpie()
# 训练数据模型
magpie.train_word2vec('data/train_data', vec_dim=vec_dim)
magpie.fit_scaler('data/train_data')
magpie.init_word_vectors('data/train_data', vec_dim=vec_dim)
# 打开标签汇总文档
label = open(lables_dir, "r", encoding='utf-8')
label = label.readlines()
labels = []
for i in label:
i = i.replace("\n", "")
labels.append(i)
# 训练数据
magpie.train('data/train_data', labels, test_ratio=0.2, nn_model=nn_model, epochs=epochs)
# 保存模型
magpie.save_word2vec_model('./data/model/word2vec_model')
magpie.save_scaler('./data/model/model', overwrite=True)
magpie.save_model('./data/model/model.h5')
type_dict = {
"药品": "1",
"营养学": "2",
"健身": "3",
"中医": "4",
"减肥": "5",
"推拿": "6",
"健康": "7",
"养生": "8",
"癌症": "9",
"睡眠": "10",
"跑步": "11",
"蔬菜": "12",
"水果": "13",
"护肤": "14",
"烹饪技巧": "15",
"中药": "16",
"菜谱": "17",
"游泳": "18",
"公益": "19",
"美体": "20"
}
训练过程如下,总体效果还不错
结果预测
每次预测需要把数据处理成训练模型时候数据处理的样子
from magpie import Magpie
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
# 打开标签汇总文档
lables_dir = 'data/labels.txt'
label = open(lables_dir, "r", encoding='utf-8')
label = label.readlines()
labels = []
for i in label:
i = i.replace("\n", "")
labels.append(i)
magpie = Magpie(
keras_model='./data/model/model.h5',
word2vec_model='./data/model/word2vec_model',
scaler='./data/model/model',
labels=labels
)
magpie.predict_from_file("./data/train_data/605d4e9f8ac0ed5276c7a9c6.txt")
预测结果最终是一个概率值,自己分类一个权重阈值判断类别就可以了