自然语言处理N天-Day0601基于ML的中文短文本分类

新建 Microsoft PowerPoint 演示文稿 (2).jpg

说明:本文依据《中文自然语言处理入门实战》完成。目前网上有不少转载的课程,我是从GitChat上购买。

这两节课分别是分类和聚类问题,刚才突然大脑短路,在想分类和聚类的区别。

  • 分类就是根据文本的特征或属性,划分到已有的类别中。也就是说,这些类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。
  • 聚类就是你压根不知道数据会分为几类,通过聚类分析将数据或者说用户聚合成几个群体,那就是聚类了。聚类不需要对数据进行训练和学习。

分类属于监督学习,聚类属于无监督学习。

第六课 基于ML的中文短文本分类

教程中使用的数据是作者曾经做过的一份司法数据,需求是对每一条输入数据,判断事情的主体是谁,比如报警人被老公打,报警人被老婆打,报警人被儿子打,报警人被女儿打等来进行文本有监督的分类操作。
教程又没有数据,应该是和响应的保密守则有关,真是服了,然后让读者去上他的chat?
看了一下输出的部分数据,是一个简要记录和出警记录,另外有一个标签,出警为0,未出警为1,我们可以手动生成一个。
我把生成的数据放在github中了,大家可以去下载,也可以自己做一个。

import random
import jieba
import pandas as pd

stopwords=pd.read_csv(r'C://Users//01//Desktop//stopwords.txt',index_col=False,quoting=3,sep="\t",names=['stopword'],encoding='utf-8')
stopwords=stopwords['stopword'].values
print(stopwords)

erzi_data=pd.read_excel(r'C://Users//01//Desktop//randomdata.xlsx',sheet_name=0)
linju_data=pd.read_excel(r'C://Users//01//Desktop//randomdata.xlsx',sheet_name=1)
laogong_data=pd.read_excel(r'C://Users//01//Desktop//randomdata.xlsx',sheet_name=2)
laopo_data=pd.read_excel(r'C://Users//01//Desktop//randomdata.xlsx',sheet_name=3)
print(laopo_data)

erzi=erzi_data.values.tolist()
linju=linju_data.values.tolist()
laogong=laogong_data.values.tolist()
laopo=laopo_data.values.tolist()

#定义分词和打标签函数preprocess_text
#参数content_lines即为上面转换的list
#参数sentences是定义的空list,用来储存打标签之后的数据
#参数category 是类型标签
def preprocess_text(content_lines, sentences, category):
    for line in content_lines:
        line="".join(line)
        try:
            segs=jieba.lcut(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
sentences=[]
preprocess_text(laogong, sentences, 0)
preprocess_text(laopo, sentences, 1)
preprocess_text(erzi, sentences, 2)
preprocess_text(linju, sentences, 3)

print(sentences)
random.shuffle(sentences)
for sentence in sentences:
    print(sentence)

抽取词向量特征

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split

# CountVectorizer生成的是词频向量。
vec = CountVectorizer(analyzer='word', max_features=4000)
x, y = zip(*sentences)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=42)
# 训练数据转为词袋模型BOW
vec.fit(x_train)

使用贝叶斯和SVM进行训练

# 使用朴素贝叶斯进行训练
from sklearn.naive_bayes import MultinomialNB

classifier = MultinomialNB()
classifier.fit(vec.transform(x_train), y_train)

print(classifier.score(vec.transform(x_test), y_test))

# 使用支持向量机SVM进行训练
from sklearn.svm import SVC

svm = SVC(kernel='linear')
svm.fit(vec.transform(x_train), y_train)
print(classifier.score(vec.transform(x_test), y_test))

两次训练结果都不高,一个是0.59,一个是0.83原因可能是输入的文本处理方面的问题。

现在回顾一下整个流程,整个分类流程包括以下几部分

  • 文本读取的处理,一般使用pandas结合jieba进行分词。在分词过程中打好标签,因为分类是监督学习,必须有标签。
  • 分词后的文本统一纳入一个list中。
  • 抽取词向量特征,使用sklearn中的文本分类函数将list进行特征抽取生成词袋模型
  • 对词袋模型进行随机拆分,一个训练集和一个测试集,导入训练模型中进行训练。
  • 评估训练结果。

你可能感兴趣的:(自然语言处理N天-Day0601基于ML的中文短文本分类)