【python3】基于贝叶斯和TF-IDF的新闻内容分类

前言

这个项目实战系列主要是跟着网络上的教程来做的,主要参考《跟着迪哥学习机器学习》中的思路和具体实现代码,但是书中使用到的应该是python2的版本,有一些代码也有问题,有的是省略了一些关键的步骤,有的是语法的问题,总之就是并不是直接照着敲就能够一路运行下来的。这里整理了能够运行的代码和数据集(链接容易挂,需要请私聊)。

系列导航

思路

贝叶斯公式:
P ( D ∣ h ) = P ( D ) P ( h ∣ D ) P ( h ) P(D|h) = \frac{P(D)P(h|D)}{P(h)} P(Dh)=P(h)P(D)P(hD)
理解这个公式的作用:已知学校男女生的数目,男生穿长裤的概率和女生穿长裤的概率,求已知一个人穿长裤,那他是女生的概率;这个问题可以解决:先得到学校的人穿长裤的人数,在得到女生穿长裤的人数,那么是女生的概率=女生穿长裤的人数/学校穿长裤的总人数,即
P ( 是 女 生 ∣ 穿 长 裤 ) = U ( 女 孩 穿 长 裤 ) U ( 学 校 穿 长 裤 ) = U ( 女 生 穿 长 裤 ) U ( 女 生 穿 长 裤 ) + U ( 男 生 穿 长 裤 ) = P ( 女 生 穿 长 裤 ) U ( 女 生 ) P ( 女 生 穿 长 裤 ) U ( 女 生 ) + P ( 男 生 穿 长 裤 ) U ( 男 生 ) = P ( 女 生 穿 长 裤 ) P ( 是 女 生 ) ∗ U ( 学 校 总 人 数 ) P ( 女 生 穿 长 裤 ) P ( 女 生 ) U ( 学 校 总 人 数 ) + P ( 男 生 穿 长 裤 ) P ( 是 男 生 ) U ( 学 校 总 人 数 ) = P ( 女 生 穿 长 裤 ) P ( 是 女 生 ) U ( 穿 长 裤 ) U ( 学 校 人 数 ) = P ( 女 生 穿 长 裤 ) P ( 是 女 生 ) P ( 穿 长 裤 ) P(是女生|穿长裤) = \frac{U(女孩穿长裤)}{U(学校穿长裤)} \\ = \frac{U(女生穿长裤)}{U(女生穿长裤)+U(男生穿长裤)} \\ = \frac{P(女生穿长裤)U(女生)}{P(女生穿长裤)U(女生)+P(男生穿长裤)U(男生)} \\ = \frac{P(女生穿长裤)P(是女生)*U(学校总人数)}{P(女生穿长裤)P(女生)U(学校总人数)+P(男生穿长裤)P(是男生)U(学校总人数)} \\ = \frac{P(女生穿长裤)P(是女生)}{\frac{U(穿长裤)}{U(学校人数)}} \\ = \frac{P(女生穿长裤)P(是女生)}{P(穿长裤)} P(穿)=U(穿)U(穿)=U(穿)+U(穿)U(穿)=P(穿)U()+P(穿)U()P(穿)U()=P(穿)P()U()+P(穿)P()U()P(穿)P()U()=U()U(穿)P(穿)P()=P(穿)P(穿)P()

import pandas as pd
df_news = pd.read_table('data.txt',names=['category','theme','URL','content'],encoding='utf-8')
df_news = df_news.dropna()
df_news.head()
categorythemeURLcontent
0汽车现代飞思现金直降8000元 现车颜色齐全http://autos.cn.yahoo.com/ypen/20120610/110144...近日,编辑从进口现代合肥地区某经销商处了解到,即日起至6月30日到该店购买现代飞思现金直降8...
1汽车丰田皇冠对问题车型实行“暗召回”http://autos.cn.yahoo.com/ypen/20120615/111456...虽然说代表王权的皇冠(车型 配置 图片 报价)并非谁都可以拥有,但皇冠汽车,只要有足够的钞票...
2汽车价格战爆发 京城豪华车日子也不好过http://autos.cn.yahoo.com/ypen/20120612/110681...“今年上半年的日子不好过呀!”的确,今年上半年,京城车市并非只是一些自主品牌的日子难熬,之前...
3汽车成都车展一神秘女子买走400万绝版宾利车http://autos.cn.yahoo.com/newspic/autos2/5363/...在宾利展厅,下午4点以前,一款车一直没有揭开真面目,覆盖在车身上的天鹅绒幕布更让人感受到这款...
4汽车通用和欧宝工会拟11月之前达成重组协议http://autos.cn.yahoo.com/ypen/20120615/111428...据外媒消息,通用汽车公司与德国金属工业工会拟在11月份之前就欧宝重组的问题达成明确协议。5鹿...

数据预处理

这份数据都是文本,分类结果都是文本,所以,需要先将文字转换为特征,将文章转为向量形式才能输入模型

数据清洗

# 将每一篇文章转换为列表
content = df_news.content.values.tolist()
print(content[10000])
北京时间6月7日凌晨消息,职业社交网站LinkedIn尚未对用户密码泄露一事作出明确的回应,该公司在最新发布的Twitter消息中称:“我们的团队仍在继续调查此事,但就目前而言,仍无法确认任何破坏安全的行为已经发生。”=裉煸缧┦焙蛴斜ǖ莱疲LinkedIn的650万用户密码已泄露,并被发布在俄罗斯一家黑客网站上。报道称,超过30万的用户密码已经被解密,而且更多的密码正在解密过程中。LinkedIn用户总数超过1.5亿,这意味着被泄露的用户密码不到用户总数的10%,但受影响的用户仍旧很多。H绻这一报道的内容属实,那么LinkedIn无法找到其网站系统被侵入的任何迹象与Twitter上许多用户发布的消息就是不相符的,这些用户称其已经在名单上发现了自己LinkedIn账号的密码。与此同时,华尔街也对此感到担心,LinkedIn今天股价已经下挫1%以上,而整体科技类股则正在上扬。S泄卮舜蚊苈胄孤妒录的最初报道是被一个俄罗斯论坛上的一名用户触发的,这名用户宣称他已侵入LinkedIn网络,并向互联网上传了近650万个密码。在这些密码中,有很多都带有“linkedin”这个单词,这让国外科技网站The Verge及其他许多来源都认为这一消息的可靠性较高。#蹋椋睿耄澹洌桑畹拿苈氩捎茫樱龋粒1加密方式,这是被视为很安全的一种加密方式。但有报道称,一些黑客团体正在破解密码,复杂一些的密码不容易被破解,但比较简单的密码则容易受到损害。R到缛耸恐赋觯无论报道内容是否属实,LinkedIn用户都应马上更改密码,伦敦Sophos公司高级技术顾问Graham Cluley已在博客上详细列出了更改密码的程序。

注:jieba库分词的原理是HMM隐马尔可夫模型

import jieba
content_S = []
for line in content:
    # 文章分词
    current_segment = jieba.lcut(line)
    if(len(current_segment)>1 and (current_segment!='\r\n')):
        # 保存分词结果
        content_S.append(current_segment)
Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\CUIPRO\AppData\Local\Temp\jieba.cache
Loading model cost 0.813 seconds.
Prefix dict has been built successfully.
# 展示分词结果
df_content = pd.DataFrame({'content_S':content_S})
df_content.head()
content_S
0[近日, ,, 编辑, 从, 进口, 现代, 合肥, 地区, 某, 经销商, 处, 了解, ...
1[虽然, 说, 代表, 王权, 的, 皇冠, (, 车型,  , 配置,  , 图片,  ,...
2[“, 今年, 上半年, 的, 日子, 不好过, 呀, !, ”, 的确, ,, 今年, 上...
3[在, 宾利, 展厅, ,, 下午, 4, 点, 以前, ,, 一款, 车, 一直, 没有,...
4[据, 外媒, 消息, ,, 通用汽车公司, 与, 德国, 金属, 工业, 工会, 拟, 在...

一篇文章的主题由文章的一些关键字决定;一些词语会影响分类任务,被包括于各个主题的文章中影响判断,被称为“停用词”需要过滤。

停用词,一种方法:基于词频进行统计,普遍情况下高频词都是停用词

TF-IDF关键词提取

如果一个词语在所有文章中出现的次数都很高,那么这个词语就不是很重要,更加像一个通用词。反之亦反。
T F − I D F = T F ( 词 频 ) ⋅ I D F ( 逆 文 档 频 率 ) TF-IDF = TF(词频)·IDF(逆文档频率) \\ TFIDF=TF()IDF()
T F = N 某 个 词 在 文 章 中 出 现 的 次 数 N 文 章 的 总 词 数 TF = \frac{N_{某个词在文章中出现的次数}}{N_{文章的总词数}} TF=NN
I D F = l o g ( N 语 料 库 文 档 总 数 N 包 含 该 词 的 文 档 数 + 1 ) IDF = log(\frac{N_{语料库文档总数}}{N_{包含该词的文档数}+1}) IDF=log(N+1N)

import jieba.analyse
index = 2400
content_S_str = "".join(content_S[index])
print(content_S_str)
# 打印核心词
print(" ".join(jieba.analyse.extract_tags(content_S_str,topK=5,withWeight=False)))
“整个广州骂声一片”,对于广州出台的汽车限购措施,一位广州的朋友说。F涫担在北京实行汽车限购措施之后,大家对广州等大城市实行汽车限购早已有心理准备。今年两会期间,广汽集团总经理曾庆洪就曾坦言:城市的汽车和道路、能源、环境等社会环境系统如果不能协调发展,不管是深圳还是广州,迟早都得限购。5是,广州的汽车限购仍然迎来了“骂声一片”。T因主要有两个,第一,大家对于广州是不是非限不可心存疑问。汽车行业对于北京的限购虽颇有微词,但北京“首堵”的形象已经深入人心,总有些“不限真不行”的同情。广州汽车保有量不及北京一半,每月销量也仅仅达到北京限购之后的数量。对这样的情况采取限购措施来治理拥堵,难免有方式方法过于简单粗暴的嫌疑。5诙,虽然广州的限购政策将基本参照北京的措施,但是广州限购带来的示范效应可能远远超过北京。北京的限购带来的示范效果,各城市多是有心模仿但总觉得心虚,毕竟那是拥有400多万辆车的首都。广州限购之后,情况可能发生变化,毕竟与广州情况类似的城市更多一些。业界对于广州限购带来的后果非常担心。5比唬汽车行业对于广州限购的不满还有一个原因,那就是北京汽车限购政策是在车市快速增长时出台,而现在车市低迷,广州的限购颇有些落井下石的味道。F车社会来临,城市拥堵是一个国际难题。更快的发展公共交通,更好的城市和道路规划是全球通用的解决办法,我国也不能例外,不能简单地一限了之。消费者买不买车是纯粹的市场问题,应该交给市场去解决。(袁涛)
限购 广州 北京 汽车 城市

停用词过滤文本

# 提取指定的停用词
stopwords = pd.read_csv('stop.txt',index_col=False,sep='\t',quoting=3,names=['stopword'],encoding='utf-8')
# 提取停用词
def drop_stopwords(conents,stopwords):
    contents_clean = []
    all_words = []
    for line in contents:
        line_clean = []
        for word in line:
            if word in stopwords:
                continue
            if len(word.strip())==0:
                continue
            line_clean.append(word)
            all_words.append(str(word))
        contents_clean.append(line_clean)
    return contents_clean,all_words
contents = df_content['content_S'].values.tolist()
stopwordlist = stopwords['stopword'].values.tolist()
contents_clean,all_words = drop_stopwords(contents,stopwordlist)

去除停用词之后的内容

df_clean_content = pd.DataFrame({'contents_clean':contents_clean})
df_clean_content.head()
contents_clean
0[近日, 编辑, 进口, 合肥, 地区, 经销商, 处, 即日起, 日到, 该店, 购买, ...
1[代表, 王权, 皇冠, 车型, 配置, 图片, 报价, 拥有, 皇冠, 汽车, 足够, 钞...
2[上半年, 日子, 不好过, 上半年, 京城, 车市, 自主, 品牌, 日子, 难熬, 羡慕...
3[宾利, 展厅, 下午, 点, 一款, 车, 揭开, 真面目, 覆盖, 车, 身上, 天鹅绒...
4[外媒, 消息, 通用汽车公司, 德国, 金属, 工业, 工会, 拟, 月份, 欧宝, 重组...

所有单词的结果

df_all_words = pd.DataFrame({'all_words':all_words})
df_all_words.head()
all_words
0近日
1编辑
2进口
3合肥
4地区

单词统计

words_count = df_all_words.groupby(by=['all_words'])['all_words'].agg([('count',np.size)])
words_count = words_count.reset_index().sort_values(by=['count'],ascending=False)
# words_count[:50]

词云图

stopo = str(words_count[4:5]['all_words']).split(" ")[4].split("\n")[0]
print(chr(8212)=='—')
True
from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10.0,5.0)

wordcloud = WordCloud(font_path='./fonts/simhei.ttf',background_color="white",max_font_size=80)
word_frequence = {x[0]:x[1] for x in words_count.head(100).values}
wordcloud = wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
<matplotlib.image.AxesImage at 0x26ca4dff220>

在这里插入图片描述

LDA建模

# 关键字
import jieba.analyse
index = 10001
print(df_news['content'][index])
content_S_str = ''.join(content_S[index])
【最偏远的陆地】位于美国南达科他州的北美洲PofA 是其中一个“难抵极(The Pole of Inaccessibility)”,它所在大陆的这个点,从任何海洋和各个方向来说都是最远点。“难抵极”也分很多个等级,其中最难抵达的“难抵极”都位于寒冷的南极荒原上。

文档自动提取语义主题

from gensim import corpora, models, similarities
import gensim
# 词袋
dictionary = corpora.Dictionary(contents_clean)
corpus = [dictionary.doc2bow(sentence) for sentence in contents_clean]
lda = gensim.models.ldamodel.LdaModel(corpus=corpus,id2word=dictionary,num_topics=20)
# 一号词袋分类结果
print(lda.print_topic(1,topn=5))
0.009*"考生" + 0.007*"高考" + 0.004*"食品" + 0.004*"考试" + 0.004*"营养"
for topic in lda.print_topics(num_topics=20,num_words=5):
    print(topic[1])
0.013*"男人" + 0.012*"孩子" + 0.011*"女人" + 0.008*"记者" + 0.007*"网友"
0.009*"考生" + 0.007*"高考" + 0.004*"食品" + 0.004*"考试" + 0.004*"营养"
0.018*"车型" + 0.014*"设计" + 0.012*"产品" + 0.011*"采用" + 0.010*"发动机"
0.046*"比赛" + 0.022*"球队" + 0.016*"欧洲杯" + 0.014*"选手" + 0.013*"观众"
0.018*"电影" + 0.011*"导演" + 0.009*"时尚" + 0.008*"拍摄" + 0.008*"观众"
0.010*"医院" + 0.010*"吃" + 0.009*"身体" + 0.009*"女性" + 0.008*"健康"
0.019*"发展" + 0.012*"建设" + 0.010*"政策" + 0.009*"文化" + 0.008*"服务"
0.027*"市场" + 0.022*"投资" + 0.019*"公司" + 0.016*"基金" + 0.009*"投资者"
0.016*"记者" + 0.012*"海军" + 0.010*"米" + 0.009*"部队" + 0.008*"名"
0.033*"感染" + 0.023*"甜美" + 0.021*"文学" + 0.017*"页" + 0.016*"座椅"
0.027*"中国" + 0.007*"企业" + 0.006*"发展" + 0.005*"公司" + 0.004*"专业"
0.014*"管理" + 0.011*"计划" + 0.010*"部门" + 0.008*"组织" + 0.008*"人员"
0.036*"澹" + 0.032*"椋" + 0.028*"手机" + 0.025*"幔" + 0.023*"睿"
0.030*"增长" + 0.018*"下降" + 0.016*"亿美元" + 0.014*"同比" + 0.014*"亿元"
0.058*"转" + 0.041*"矗埃埃福" + 0.018*"小学" + 0.017*"头发" + 0.015*"矗"
0.052*"学生" + 0.043*"学校" + 0.025*"老师" + 0.021*"饰演" + 0.018*"家长"
0.009*"苹果" + 0.007*"消费者" + 0.007*"记者" + 0.006*"销售" + 0.005*"游戏"
0.008*"美国" + 0.008*"中国" + 0.007*"节目" + 0.006*"报道" + 0.006*"媒体"
0.018*"网站" + 0.016*"支付" + 0.015*"合同" + 0.014*"信息" + 0.013*"用户"
0.044*"娱乐圈" + 0.024*"作品" + 0.019*"女神" + 0.018*"中小企业" + 0.015*"艺术品"

基于贝叶斯的新闻分类

df_train = pd.DataFrame({'contents_clean':contents_clean,'label':df_news['category']})
df_train.tail()
contents_cleanlabel
64995[天气, 炎热, 补水, 变得, 美国, 跑步, 世界, 杂志, 报道, 喝水, 身体, 补...时尚
64996[不想, 话, 刺激, 只能, 走, 离开, 伤心地, 想起, 一句, 话, 命中, 终须,...时尚
64997[刘晓庆, 最新, 嫩照, 衷, 诘, 牧跸, 庆, 看不出, 秒杀, 刘亦菲, 范冰冰, ...时尚
64998[导语, 爸爸, 幸福, 无论是, 领养, 亲生, 更何况, 影视剧, 时尚, 圈, 永远,...时尚
64999[全球, 最美, 女人, 合成图, 国, 整形外科, 教授, 李承哲, 国际, 学术, 杂志...时尚
train_labels = df_train.label.unique()
train_labels
array(['汽车', '财经', '科技', '健康', '体育', '教育', '文化', '军事', '娱乐', '时尚'],
      dtype=object)

由于此时的标签是字符,需要转换为数值类型

label_mapping = {}
temp_labels = list(train_labels)
for i in range(len(temp_labels)):
    label_mapping[temp_labels[i]] = i
label_mapping
{'汽车': 0,
 '财经': 1,
 '科技': 2,
 '健康': 3,
 '体育': 4,
 '教育': 5,
 '文化': 6,
 '军事': 7,
 '娱乐': 8,
 '时尚': 9}

构建映射方法,将所有的名字替换成唯一数字即可

df_train['label'] = df_train['label'].map(label_mapping) 
from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(df_train['contents_clean'].values,df_train['label'].values,
                                                 random_state=1)

目前已经处理了标签,切分了数据集,接下来就要提取文本特征了

实现简易词袋模型

from sklearn.feature_extraction.text import CountVectorizer
texts=['dog cat fish','dog cat cat','fish bird','bird']
# 词频统计
cv = CountVectorizer()
# 转换数据
cv_fit = cv.fit_transform(texts)
print(cv.get_feature_names())
['bird', 'cat', 'dog', 'fish']
<bound method _cs_matrix.toarray of <4x4 sparse matrix of type '<class 'numpy.int64'>'
	with 8 stored elements in Compressed Sparse Row format>>
cv_fit.toarray()
array([[0, 1, 1, 1],
       [0, 2, 1, 0],
       [1, 0, 0, 1],
       [1, 0, 0, 0]], dtype=int64)

只考虑词频,而不考虑词语出现的位置以及先后顺序

from sklearn.feature_extraction.text import CountVectorizer
# 不止包含一个词,还包含2个、三个词的组合
texts=['dog cat fish','dog cat cat','fish bird','bird']
cv2 = CountVectorizer(ngram_range=(1,4))
cv2_fit = cv2.fit_transform(texts)
print(cv2.get_feature_names())
['bird', 'cat', 'cat cat', 'cat fish', 'dog', 'dog cat', 'dog cat cat', 'dog cat fish', 'fish', 'fish bird']
print(cv2_fit.toarray)
<bound method _cs_matrix.toarray of <4x10 sparse matrix of type '<class 'numpy.int64'>'
	with 15 stored elements in Compressed Sparse Row format>>

构建词袋模型

x_train[0][1]
'接任'
words = []
for line_index in range(len(x_train)):
    try:
        words.append(' '.join(x_train[line_index]))
    except:
        print(line_index,word_index)
words[0]
'雅虎 体育讯 特拉 帕托尼 对阵 西班牙 作出 轮换 他会 信任 首场 比赛 首发 球员 西班牙 采用 战术 首发 特拉 帕托尼 作出 太 猜测 尔兰 首场 比赛 输给 克罗地亚 次战 面对 卫冕冠军 西班牙 再输 爱尔兰 提前 出局 主帅 特拉 帕托尼 西班牙 比赛 大规模 轮换 球员 首轮 担任 首发 球员 充满信心 保 输给 克罗地亚 令 爱尔兰 出线 形势 变得 严峻 克罗地亚 比赛 表现 令人 失望 有人 特拉 帕托尼 弃用 首发 球员 这位 老帅 主力球员 依然 充满信心 拔 颐 堑 蚨 娑 灾名 球队 著名 球员 更好 演出 实力 特拉 帕托尼 说道 一般来说 西班牙 统治 中场 拥有 球员 作出 调整 球员 双重 考克斯 沃尔特斯 带来 问到 队长 罗比 基恩 让位 特拉 帕托尼 说道 基恩 一名 球员 拥有 经验 乩 帕托尼 不太可能 西班牙 比赛 桑德兰 麦克利 恩 上阵 他会 信任 老队员 合适 时机 安排 年轻 球员 上阵 处于 压力 比赛 适合 肩膀 沉重 负担 靼 嘌乐魉 Р ┧ 箍 嗽 诙 砸 獯 罄 赛事 安排 正式 中锋 首发 令 所有人 感到 意外 特拉 帕托尼 承认 猜测 博斯克 战术 安排 完 首场 比赛 派出 托雷斯 博斯克 战术 耙 残 硭 意大利人 拥有 很强 防守 派出 矮小 快速 技术 球员 理解 场上 作出 改变 安排 一名 高大 中锋 前场 托雷斯 很大 机会 派 迎战 拥有 实力 想法 派出 托雷斯 派出 伦特 其他人 这是 博斯克'
from sklearn.feature_extraction.text import CountVectorizer
# 不止包含一个词,还包含2个、三个词的组合
vec = CountVectorizer(analyzer='word',max_features=4000,lowercase=False)
feature = vec.fit_transform(words)
feature.shape
(48750, 4000)

输入贝叶斯模型

# 处理测试的词袋模型
test_words = []
for line_index in range(len(x_test)):
    try:
        test_words.append(' '.join(x_test[line_index]))
    except:
        print(line_index,word_index)
test_words[0]
'简单 直观 地说 卵巢囊肿 就是指 卵巢 内部 表面 生成 肿块 卵巢囊肿 症状 液体 固体 液体 固体 混合 卵巢囊肿 体积 类似 豌豆 腰果 囊肿 长得 垒球 更大 幸窖 卵巢囊肿 因素 薄 ⑻ 叼 瞿结 忧思 伤 虚生 痰 痰饮 停聚 阻滞 气机 气滞 血瘀 痰饮 血瘀 结成 块 痰 瘀 久积 导致 癌症 除有 气血 凝滞 症状 外 患者 常有 胃脘 满闷 心慌 气短 纳差 浮肿 呕恶 筋惕肉 腹围 增粗 月经 紊乱 排尿 困难 急 大便 畅 下腹 或窝部 充胀 下坠 感等 现象 病 ⑵ 血 凝滞 期 产后 受寒 寒 凝血 滞 内伤 情志 抑郁 伤肝 气机 运行 畅 气滞 血 滞 气 血瘀 凝而致 瘀积 日久 癌症 表现 下腹部 肿块 外 症状 或仅 舌 瘀 点 如为 恶性 下腹部 肿块 坚硬 固定 疼痛 拒按 皮肤 不润 面色 紫 舌有 瘀 点 恶性 晚期 患者 腹水 形 枯槁 神 疲乏 力等症 那槠 鸱大易 患 卵巢囊肿 幸饺 衔 卵巢囊肿 发生 脏腑 虚弱 气血 劳损 七情 太过 风冷 寒湿 内侵 经产 血瘀 阻滞 肾阳 不振 寒凝 气滞 阴液 散布 失司 痰饮 夹瘀 痰饮 夹 气滞 内留 或痹 阳气 日衰 阴凝不化 增大 肠 覃 膏药 治病 求本 原则 疏肝理气 扶正 因本 活血化瘀 软坚散结 清热解毒 治疗 思路 气血 肌体 物质基础 脏腑 气血 生化 之源 分管 气血 生成 统摄 运行 肠覃 膏药 活跃 肝 脾 脏腑 调节 气血 平衡 调理 内分泌 治愈 卵巢囊肿 之疾 目的 幸街 瘟坡 殉材 抑鬃 槌 煞剑糊 濉 保部 耍 白芥子 克 三棱 克 苡 仁 克 桃仁 克 夏枯草 克 南星 克 赤芍 克 δ 埽 豪砥行 滞 活血 祛痰 化瘀 散结 软坚 消肿 髦 危 菏视 酶 髦 帜 抑祝 卵巢囊肿 效果显著 子宫 肌瘤 畸胎瘤 肝肾 囊肿 疗效 梅 ǎ 核煎服 药液 毫升 每服 毫升 每日 次 天为 疗程 ~ 疗程 超 次 疗效 服药 肿瘤 消失 用药 疗程 肿瘤 增大 无效 检查 进一步 诊断 治疗 浇 猓 悍 街腥 棱 桃仁 赤芍 理气 行滞 活血 祛瘀 海藻 夏枯草 白芥子 消痰 软坚 散结 消肿 南星 苡 仁化 湿 祛痰 白芥子 海藻 配合 消除 黏腻 阴邪 诸药 配伍 痰 湿化 气血 通 囊肿 消 虚寒 加 肉桂 炮姜 鹿角胶 偏 气虚 加 黄芪 党参 白术 偏 血虚 加 熟地 当归 阿胶 偏痰 湿者 加云 茯苓 苍术 土茯苓 偏 血瘀 加 水蛭 地鳖虫 泽兰 偏气 郁者 加 香附 郁金 橘核 偏 郁热 加 丹皮 黄柏 大黄 偏痛 重者 加元 胡 川楝子 乳香 没药 炮 山甲 偏 肾虚 腰痛 加 杜仲 枸杞 小腹 剧烈 疼痛 超 检查 看其 肿瘤 扭转 否 扭转 手术 治疗 し 缆 殉材 抑子 兴恼 旋 薄 ⒅ 厥 樱糊 啻 浩 谑 锹 殉卜 ⒂ 成熟 功能 旺盛 时期 时期 卵巢 细胞 增长 极易 体内 各种因素 刺激 发生 卵巢囊肿 倥如 发育 特早 性成熟 加速 月经 不规则 尿频 腹部 剧痛 腹部 包块 症状 父母 应 孩子 医院 检查 延误 时机 专业 医师 病史 查询 详细 体检 型 超声波 激素 测定 手段 患有 卵巢囊肿 病 ⒆ 圆 椋 糊 梢 栽 谇 宄 啃 牙 词保 空腹 排空 大小便 床上 取 仰卧位 屈 髋 屈膝 腹部 放松 手指尖 压 下腹 各部 两侧 仔细 触摸 有无 包块 早期 自我 卵巢 肿物 体瘦 肤软 女性 易 自摸 自检 场 ⒏ 炯 糊 矶 喔 究撇 济挥性 缙 谥 ⒆ 矗 女性朋友 重视 妇科 检查 有没有 异常 应 自觉 定时 妇科 检查 高危 人群 每半年 检查 最少 妇科 检查 础 ⒁ 食 殉材 抑谆颊 咭 食宜 清淡 富含 足够 营养 纠正 偏食 饮食习惯 不宜 食用 刺激性 海产品 高度 紧张 精神 刺激 乐观 情绪 充足 睡眠'
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB() # 主要是做平滑处理,目的在于求解先验概率和条件概率的时候避免值为0
classifier.fit(feature,y_train)
classifier.score(vec.transform(test_words),y_test)
0.7708307692307692

应用TF-IDF

from sklearn.feature_extraction.text import TfidfVectorizer
X_test = ['卡尔 哈哈 厉害','卡尔 利好 强']
tfidf = TfidfVectorizer()
weight = tfidf.fit_transform(X_test).toarray()
word = tfidf.get_feature_names()
print(weight)
for i in range(len(weight)):
    print(u"第",i,u"篇文章的tf-idf权重特征")
    for j in range(len(word)):
        print(word[j],weight[i][j])
[[0.         0.44943642 0.6316672  0.6316672 ]
 [0.81480247 0.57973867 0.         0.        ]]
第 0 篇文章的tf-idf权重特征
利好 0.0
卡尔 0.4494364165239821
厉害 0.6316672017376245
哈哈 0.6316672017376245
第 1 篇文章的tf-idf权重特征
利好 0.8148024746671689
卡尔 0.5797386715376657
厉害 0.0
哈哈 0.0

应用TF-IDF

vectorizer = TfidfVectorizer(analyzer='word', max_features=4000, lowercase=False)
vectorizer.fit(words)
classifier = MultinomialNB()
classifier.fit(vectorizer.transform(words),y_train)
classifier.score(vectorizer.transform(test_words),y_test)
0.7820923076923076

改进建议

基于机器学习的语义分析还是不如深度学习的LSTM等经典模型,使用的模型准确率较低。同时对于停用词的选用,应该尝试一些自动化的脚本,而不是人工添加。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现中文文本分类,一般需要进行以下几个步骤: 1. 数据预处理:对中文文本进行分词,去除停用词等操作,将文本转化为词向量表示。 2. 特征选择:使用TF-IDF对文本进行特征选择,选择出对分类有帮助的特征词。 3. 构建分类器:使用机器学习算法或者深度学习算法构建分类器,比如朴素贝叶斯、支持向量机、神经网络等。 以下是一个简单的示例代码,使用朴素贝叶斯算法进行中文文本分类: ```python import jieba from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB # 加载数据 with open('data.txt', 'r', encoding='utf-8') as f: data = f.readlines() # 分词 data = [list(jieba.cut(line.strip())) for line in data] # 转化为字符串 data = [' '.join(line) for line in data] # 特征选择 tfidf = TfidfVectorizer() X = tfidf.fit_transform(data) # 构建分类器 y = [0, 1, 0, 1, 0, 1] # 标签 clf = MultinomialNB() clf.fit(X, y) # 测试 test_data = ['这是一篇关于机器学习的文章', 'python是一门很好的编程语言'] test_data = [list(jieba.cut(line.strip())) for line in test_data] test_data = [' '.join(line) for line in test_data] X_test = tfidf.transform(test_data) y_pred = clf.predict(X_test) print(y_pred) ``` 需要注意的是,上述代码仅是一个简单的示例,实际应用中还需要进行更加细致的数据预处理和特征选择,并且需要考虑到模型的评估和调参等问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值