前言
随着信息化的快速发展,电网各企业积累的数据越来越多。在电力操作规则,运维记录,调度运行记录,营销档案,客服,故障检修等存在着大量文本类数据[由于中文文本类数据的复杂性,无法直接运用机器学习对文本数据进行智能化分析,因此基于电力文本的文本挖掘技术研究显得十分重要。研究电力文本特征提取,电网本体建模。构建调控、检修和营销等知识图谱。支持电力调度机器人,电网设备智能运维和智能客服等,最终形成新一代电力智能搜索和问答解决方案。
1 文本分类流程
文本分类任务过程包括对文本进行预处理如用正则提取我们想要的文本、提取重要特征、文本向量化表示、分类器训练和分类器性能评估。其中提取特征和分类模型建模是文本分类任务中最重要的环节。
文本的预处理包括对文本进行分词、去除停用词(包括标点、数字和一些无意义的词)、指代消歧、统计等处理。去除停用词是对文本进行去噪,文本中的一些语气助词,虚词等不能表示特征,对分类没有价值。中文文本处理比英文文本预处理更复杂,中文文本中字与字之间是紧密相连的,分词更加复杂。常用分词算法有前向最大匹配算法,逆向最大匹配算法,以及它们的结合体双向匹配。而英文文本单词之间通过空格即能完成分词。特征提取和文本表示目的就是将文本转化为计算机可以理解的向量形式。词袋模型(Bag of Words)是用于文本表示的最简单的方法, BoW把文本转换为文档中单词出现次数的矩阵,只关注文档中是否出现给定的单词和单词出现频率,而舍弃文本的结构、单词出现的顺序和位置。词频-逆向文件频率(TF-IDF)是一种在自然语言处理中广泛使用的文本向量化方法,主要衡量一个文档中词语在文档集中的重要程度。Word2vec将训练集文档中的词语来训练word2vec权重矩阵,将每个词语映射到一个固定大小的向量。
在电力工单这种短文本分类中,目前研究还存在些问题。如短文本较短,难以提取到有用的词汇;短文本表达简洁,不规范词语较多,如一些网络用语加大分类难度。
图1 文本分类流程图
短文本分类算例实现
2 算例实现
本文主要基于95598工单完成文本分类,选取浙江省95598工单数据集3171条。其中的工单可以分类为反映、建议、表扬、举报、投诉、以往业务、查询、报修8个类别。
原始工单样例
1#导入包
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu
# @Date : 2020/6/4
import pandas as pd
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import matplotlib; matplotlib.use('TkAgg')
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
mpl.rcParams['axes.unicode_minus'] = False
zhfont1 = matplotlib.font_manager.FontProperties(fname='C:\Windows\Fonts\simsun.ttc')
import jieba as jb
import re
2#读取数据
csv='95598.csv'
file_txt=pd.read_csv(csv, header=0,encoding='gbk')#[1169656 rows x 3 columns]
file_txt=file_txt.dropna()#删除空值[1005981 rows x 2 columns]
print(file_txt.head())
file_txt['biaoqian']=''
file_txt.loc[file_txt['BUSI_TYPE_CODE']==7,'biaoqian']='反映'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==6,'biaoqian']='建议'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==5,'biaoqian']='表扬'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==4,'biaoqian']='举报'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==3,'biaoqian']='投诉'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==2,'biaoqian']='以往业务'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==1,'biaoqian']='查询'
file_txt.loc[file_txt['BUSI_TYPE_CODE']==0,'biaoqian']='报修'
print(file_txt.head())
# 定义删除除字母,数字,汉字以外的所有符号的函数
def remove_punctuation(line):
line = str(line)
if line.strip() == '':
return ''
rule = re.compile(u"[^a-zA-Z0-9\u4E00-\u9FA5]")
line = rule.sub('', line)
return line
#停用词
def stopwordslist(filepath):
stopwords = [line.strip() for line in open(filepath, 'r', encoding='gbk').readlines()]
return stopwords
5.#分词并预处理
# 加载停用词
stopwords = stopwordslist("停用词.txt")
#去除标点符号
file_txt['clean_review']=file_txt['ACCEPT_CONTENT'].apply(remove_punctuation)
#去除停用词
file_txt['cut_review']=file_txt['clean_review'].apply(lambda x:" ".join([w for w in list(jb.cut(x)) if w not in stopwords]))
print(file_txt.head())
#查看词云
from collections import Counter
from wordcloud import WordCloud
cat_id_df = file_txt[['biaoqian', 'BUSI_TYPE_CODE']].drop_duplicates().sort_values('BUSI_TYPE_CODE').reset_index(drop=True)
cat_to_id = dict(cat_id_df.values)
id_to_cat = dict(file_txt[['BUSI_TYPE_CODE', 'biaoqian']].values)
def generate_wordcloud(tup):
wordcloud = WordCloud(background_color='white',
font_path='simhei.ttf',
max_words=50, max_font_size=40,
random_state=42
).generate(str(tup))
return wordcloud
#词云
cat_desc = dict()
for cat in file_txt.biaoqian.values:
text = file_txt.loc[file_txt['biaoqian'] == cat, 'cut_review']
text = (' '.join(map(str, text))).split(' ')
cat_desc[cat] = text
fig, axes = plt.subplots(4, 2, figsize=(30, 38))
k = 0
for i in range(4):
for j in range(2):
cat = id_to_cat[0]
most100 = Counter(cat_desc[cat]).most_common(30)
ax = axes[i, j]
ax.imshow(generate_wordcloud(most100), interpolation="bilinear")
ax.axis('off')
ax.set_title("{} Top 30".format(cat), fontsize=30)
k += 1
plt.show()
7#.tf-idf
TF-IDF相比其他文本向量化方法能反应出单词的重要性,在电力工单这种短文本分类中,决定类别的是某几个单词,所以本文采用TF-IDF来进行文本向量化,在TF-IDF中使用了参数ngram_range=(1,2)
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(norm='l2', ngram_range=(1, 2))
features = tfidf.fit_transform(file_txt.cut_review)
labels = file_txt.BUSI_TYPE_CODE
#(4229, 33666)
8.#卡方检验
用的方法来找出每个分类中关联度最大的两个词语和两个词语对。可以发现每个类别关联度最高的词语和词语对还是很能表示该类别的。
#卡方检验
from sklearn.feature_selection import chi2
import numpy as np
N = 2
for cat, cat_id in sorted(cat_to_id.items()):
features_chi2 = chi2(features, labels == cat_id)
indices = np.argsort(features_chi2[0])
feature_names = np.array(tfidf.get_feature_names())[indices]
unigrams = [v for v in feature_names if len(v.split(' ')) == 1]
bigrams = [v for v in feature_names if len(v.split(' ')) == 2]
print("# '{}':".format(cat))
print(" . Most correlated unigrams:\n . {}".format('\n . '.join(unigrams[-N:])))
print(" . Most correlated bigrams:\n . {}".format('\n . '.join(bigrams[-N:])))
整理成表格
表1 关联度最高词语和词语对
类别 : 词语 —— 词语对
举报 : 查实,举报 —— 尽快 查实,查实 处理
以往业务 : 急需解决,工单 —— 工作人员 尽快,来电 表示
反映 : 不解 答复 —— 答复 客户,核实 答复
建议 : 以后,改善 —— 以后 改善,希望 以后
投诉 : 不满,合理 —— 客户 合理,合理 解释
报修 : 查处,无法 —— 现场 查处,客户 报修
查询 : 告知,查询 —— 查询 电费,客户 查询
表扬 : 及时,表扬 —— 来电 表扬,予以 表扬
9.#分类训练
选用GBDT模型,简单实现
#分类
from sklearn.model_selection import train_test_split#训练集测试集划分
from sklearn.feature_extraction.text import CountVectorizer#词袋
from sklearn.feature_extraction.text import TfidfTransformer#tfidf
from sklearn.metrics import accuracy_score#分类器评估
from sklearn.ensemble import GradientBoostingClassifier#分类器
from sklearn.externals import joblib
#划分训练集测试集
X_train, X_test, y_train, y_test = train_test_split(file_txt['cut_review'], file_txt['BUSI_TYPE_CODE'], random_state=0)
#词袋计数
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(X_train)
#joblib.dump(clf, '95598counter.model')
#tf-idf
tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
#joblib.dump(clf, '95598if_tdf.model')
#分类器模型训练
clf =GradientBoostingClassifier ()
clf.fit(X_train_tfidf, y_train)
10.预测
y_predict=clf.predict(X_train_tfidf)
y_predict=np.array(y_predict)
y_predict.reshape(-1,1)
y_train=np.array(y_train)
y_train.reshape(-1,1)
f1=accuracy_score(y_train,y_predict)
print(f1)#0.9328287606433302
精度准确率0.9328287606433302
11.简单仿真界面
在现实生活中,要想完全对电力工单实现智能化处理。则应该有语音转文本模型将语音转成文本;通过实体识别和关系提取模型将文本提取主要内容形成我们看到的工单;对工单进行分类和情感分析,以及可能的一段时间内热点问题挖掘等。