Deep Learning新闻文本预测分类(多项式贝叶斯分类模型)

代码实现如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#导入所需要的库

import jieba

import pandas as pd

from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer

from sklearn.model_selection import cross_val_score

from sklearn.naive_bayes import MultinomialNB

from sklearn.metrics import make_scorer,accuracy_score

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#调用jieba进行分词

txt="我喜欢打高尔夫"

txt_cut=jieba.cut(txt)

print(list(txt_cut))

#给“高尔夫”这个词设置较高权重

jieba.add_word("高尔夫",freq=99999)

#重新分词

txt_cut=jieba.cut(txt)

print(list(txt_cut))

#使用空格在不同词之间分隔,为后面词向量做准备

print(" ".join(txt_cut))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#2.句子的表示 —基于count的表达

txt="我喜欢看小说和喜欢看电视"

txt_cut=" ".join(jieba.cut(txt))  #使用jieba分词并用空格隔开每个词

#新建文本计数向量化器

countVectorizer=CountVectorizer(

    min_df=0,token_pattern=r"\b\w+\b"

)

txt_cut=pd.DataFrame([txt_cut],columns=["txt_cut"])

txt_cut

# countVectorizer.fit(txt_cut)  #训练文本计数向量化器

# voc=countVectorizer.vocabulary_   #获取特征词汇表

# voc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#2.句子的表示 —基于count的表达

#把文本进行计数向量化

data=pd.read_csv("CountVectorizerDemo.csv")

jieba.add_word("书",freq=99999999)

jieba.add_word("篮球",freq=99999999)

jieba.add_word("乒乓球",freq=99999999)

text_cut=[]

for index,rows in data.iterrows():  #遍历DataFrame每行数据

    text_cut.append(" ".join(jieba.cut(rows["text"]))) #分词并用空格隔开每个词,加入数组

data["text_cut"]=text_cut  #在DataFrame新增一列,加入数组

print(text_cut)

#计数向量化

countVectorizer=CountVectorizer(

    min_df=0,token_pattern=r"\b\w+\b"

)

countVectorizer.fit(data["text_cut"])  #训练文本计数向量化器

voc=countVectorizer.vocabulary_   #获取特征词汇表

print(voc)

print(sorted(voc,key=lambda x:x[0]))  #把voc顺序排序

#把文本转为文本向量

textVector=countVectorizer.transform(data["text_cut"])

#输出文本向量

textVector=textVector.toarray()

print(textVector)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#3.TF-IDF方法

#把文本进行计数向量化

data=pd.read_csv("CountVectorizerDemo.csv")

jieba.add_word("书",freq=99999999)

jieba.add_word("篮球",freq=99999999)

jieba.add_word("乒乓球",freq=99999999)

text_cut=[]

for index,rows in data.iterrows():  #遍历DataFrame每行数据

    text_cut.append(" ".join(jieba.cut(rows["text"]))) #分词并用空格隔开每个词,加入数组

data["text_cut"]=text_cut  #在DataFrame新增一列,加入数组

print(text_cut)

#实例化

tfidf = TfidfVectorizer(min_df=0,token_pattern=r"\b\w+\b")



tf_fit=tfidf.fit(data["text_cut"])

voc=tf_fit.vocabulary_   #获取特征词汇表

print(voc)

print(sorted(voc,key=lambda x:x[0]))  #把voc顺序排序

idf=tfidf.idf_

print(idf)

#把文本转为文本向量

textVector=tfidf.transform(data["text_cut"])

#输出文本向量

textVector=textVector.toarray()

print(textVector)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#3.TF-IDF方法

txt=[

    "今天 上 NLP 课程",

    "今天 的 课程 有 意思",

    "数据 课程 也 有 意思"

]

tfidf = TfidfVectorizer(min_df=0,token_pattern=r"\b\w+\b")

voc=tf_fit.vocabulary_   #获取特征词汇表

print(voc)

print(sorted(voc,key=lambda x:x[0]))

tf_fit=tfidf.fit(txt)

#把文本转为文本向量

textVector=tfidf.transform(txt)

#输出文本向量

textVector=textVector.toarray()

print(textVector)

#测试代码end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#案例:新闻文本预测分类

#加载数据

data=pd.read_csv("多项式贝叶斯.csv")

#划分x,y

x=data["fileContent"]

y=data["class"]

data

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#对x中文进行分词

fileContents=[]

for row in list(x):

    fileContent=row

    segs=jieba.cut(fileContent)

    fileContents.append(" ".join(segs))

x=fileContents

x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#本文向量化

countVectorizer=CountVectorizer(

    min_df=0,

    token_pattern=r"\b\w+\b"

)

#训练分词后的文本,提取文本特征

countVectorizer.fit(x)

#把文本转为文本向量

x_TextVector=countVectorizer.transform(x).toarray()

x_TextVector  #向量化的x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#建立多项式贝叶斯分类模型,K折交叉验证进行评分

multinomialNB=MultinomialNB()

cvs=cross_val_score(

    multinomialNB,

    x_TextVector,

    y,

    cv=3,

    scoring=make_scorer(accuracy_score)

)

cvs.mean()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#读取停用词

stop_word=pd.read_csv("StopwordsCN.txt",encoding="utf8")

print("停用词数据:",len(stop_word))



#本文向量化

countVectorizer=CountVectorizer(

    min_df=0,

    token_pattern=r"\b\w+\b",

    stop_words=list(stop_word["stopword"])  #加入停用词

)

#训练文本,提取文本特征

countVectorizer.fit(x)

#把文本转为文本向量

x_TextVector=countVectorizer.transform(x).toarray()

#建立多项式贝叶斯分类模型,K折交叉验证进行评分

multinomialNB=MultinomialNB()

cvs=cross_val_score(

    multinomialNB,

    x_TextVector,

    y,

    cv=3,

    scoring=make_scorer(accuracy_score)

)

cvs.mean()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#在0-99篇向量化后的文章中任选一篇

index=98

news=x_TextVector[index:index+1]

category=y[index:index+1] #文章类别

#使用向量化后的x,和y训练多项式贝叶斯分类模型

multinomialNB.fit(x_TextVector,y)

#调用multinomialNB.predict

r=multinomialNB.predict(news)

r

尾巴