自然语言处理之主题模型文本分类

LDA主题模型

1.主题模型(Topic Model)

主题模型是以非监督学习的方式对文集的隐含语义结构进行聚类的统计模型。主题模型主要被用于自然语言处理中的语义分析和文本挖掘问题,例如按主题对文本进行收集、分类和降维。隐含狄利克雷分布是常见的主题模型。

2.隐含狄利克雷分布LDA(Latent Dirichlet Allocation)

1)贝叶斯模型

LDA模型基于贝叶斯模型,

2)多项式分布

多项分布,是二项分布扩展到多维的情况。 多项分布是指单次试验中的随机变量的取值不再是0-1的,而是有多种离散值可能。概率密度函数为:

3)狄利克雷分布

Dirichlet的概率密度函数为:

其中,

4)共轭分布

在贝叶斯概率理论中,如果后验概率P(θ∣x)P(θ|x)P(θ∣x)和先验概率p(θ)p(θ)p(θ)满足同样的分布律,那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布。狄利克雷(Dirichlet)分布是多项式分布的共轭分布。

5)LDA主题模型

假设有MMM篇文档,对应第d个文档中有有NdN_dNd​个词。

目标是找到每一篇文档的主题分布和每一个主题中词的分布。在LDA模型中,我们需要先假定一个主题数目KKK,这样所有的分布就都基于KKK个主题展开。

LDA假设文档主题的先验分布是Dirichlet分布,即对于任一文档ddd, 其主题分布θd\theta_dθd​为:
θd=Dirichlet(α⃗)\theta_d = Dirichlet(\vec \alpha) θd​=Dirichlet(α)
其中,α\alphaα为分布的超参数,是一个KKK维向量。

LDA假设主题中词的先验分布是Dirichlet分布,即对于任一主题kkk, 其词分布βk\beta_kβk​为:
βk=Dirichlet(η⃗)\beta_k=Dirichlet(\vec \eta) βk​=Dirichlet(η​)

其中,η\etaη为分布的超参数,是一个VVV维向量。VVV代表词汇表里所有词的个数。

对于数据中任一一篇文档ddd中的第nnn个词,我们可以从主题分布θd\theta_dθd​中得到它的主题编号zdnz_{dn}zdn​的分布为:
zdn=multi(θd)z_{dn} = multi(\theta_d) zdn​=multi(θd​)

而对于该主题编号,得到我们看到的词wdnw_{dn}wdn​的概率分布为:
wdn=multi(βzdn)w_{dn} = multi(\beta_{z_{dn}}) wdn​=multi(βzdn​​)
理解LDA主题模型的主要任务就是理解上面的这个模型。这个模型里,我们有MMM个文档主题的Dirichlet分布,而对应的数据有MMM个主题编号的多项分布,这样(α→θd→z⃗d\alpha \to \theta_d \to \vec z_{d}α→θd​→zd​)就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的文档主题后验分布。

如果在第d个文档中,第k个主题的词的个数为:nd(k)n_d^{(k)}nd(k)​, 则对应的多项分布的计数可以表示为
n⃗d=(nd(1),nd(2),...nd(K))\vec n_d = (n_d^{(1)}, n_d^{(2)},...n_d^{(K)}) nd​=(nd(1)​,nd(2)​,...nd(K)​)
利用Dirichlet-multi共轭,得到θd\theta_dθd​的后验分布为:
Dirichlet(θd∣α⃗+n⃗d)Dirichlet(\theta_d | \vec \alpha +\vec n_d) Dirichlet(θd​∣α+nd​)
同样的道理,对于主题与词的分布,我们有KKK个主题与词的Dirichlet分布,而对应的数据有KKK个主题编号的多项分布,这样(η→βk→w⃗(k)\eta \to \beta_k \to \vec w_{(k)}η→βk​→w(k)​)就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的主题词的后验分布。

如果在第k个主题中,第v个词的个数为:nk(v)n_k^{(v)}nk(v)​, 则对应的多项分布的计数可以表示为
n⃗k=(nk(1),nk(2),...nk(V))\vec n_k = (n_k^{(1)}, n_k^{(2)},...n_k^{(V)}) nk​=(nk(1)​,nk(2)​,...nk(V)​)
利用Dirichlet-multi共轭,得到βk\beta_kβk​的后验分布为:
Dirichlet(βk∣η⃗+n⃗k)Dirichlet(\beta_k | \vec \eta+\vec n_k) Dirichlet(βk​∣η​+nk​)
由于主题产生词不依赖具体某一个文档,因此文档主题分布和主题词分布是独立的。

程序实现

运行环境:Anaconda 4.9.2

1.生成段落数据库

在16篇小说中选取了7篇小说在DatabaseChinese中,随机选取三篇,每篇随机抽取不小于500字的段落150段,存到DataExcel中。

def txt_convert_2_excel(file_path, data_path, K=3):logging.info('Converting txt to excel...')files = []for x in os.listdir(file_path):files.append(x)selected_files = random.sample(files, k=3)txt = []txtname = []n = 150for file in selected_files:filename = os.path.join(file_path, file)with open(filename, 'r', encoding='ANSI') as f:full_txt = f.readlines()lenth_lines = len(full_txt)i = 200for j in range(n):txt_j = ''while(len(txt_j) < 500):txt_j += full_txt[i]i += 1txt.append(txt_j)txtname.append(file.split('.')[0])i += int(lenth_lines / (3 * n))dic = {'Content': txt, 'Txtname': txtname}df = pd.DataFrame(dic)out_path = data_path+'\\data.xlsx'df.to_excel(out_path, index=False)logging.info('Convert done!')return out_path

选取的数据形式如下,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGknKLBE-1621347180920)(pic/image-20210428204530774.png)]

2.分词

创建Paragraph类,断句分词。

class Paragraph:def __init__(self, txtname='', content='', sentences=[], words=''):self.fromtxt = txtnameself.content = contentself.sentences = sentencesself.words = wordsglobal punctuationself.punctuation = punctuationglobal stopwordsself.stopwords = stopwordsdef sepSentences(self):line = ''sentences = []for w in self.content:if w in self.punctuation and line != '\n':if line.strip() != '':sentences.append(line.strip())line = ''elif w not in self.punctuation:line += wself.sentences = sentencesdef sepWords(self):words = []dete_stopwords = 1if dete_stopwords:for i in range(len(self.sentences)):words.extend([x for x in jieba.cut(self.sentences[i]) if x not in self.stopwords])else:for i in range(len(self.sentences)):words.extend([x for x in jieba.cut(self.sentences[i])])reswords = ' '.join(words)self.words = reswords

3.词频模型

主要参数:特征词数40个。

    cntVector = CountVectorizer(max_features=40)cntTf = cntVector.fit_transform(corpus)

4.LDA模型求解

主要参数:主题3个,迭代次数1000次。

    lda = LatentDirichletAllocation(n_components=3, learning_offset=50., max_iter=1000, random_state=0)docres = lda.fit_transform(cntTf)

5.SVM分类

主要参数:训练集150*0.2=30个段落。

    X = docresy = [data_list[i].fromtxt for i in range(len(data_list))]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)svm_model = LinearSVC()  # model = SVC()svm_model.fit(X_train, y_train)y_pred = svm_model.predict(X_test)

6.输出结果

输出:测试集真值与分类估计对比,输出每个主题主要词10个,绘制SVM三维三分类图片结果。

    # show test resultprint('Topic real:', '\t', 'Topic predict:', '\n')for i in range(len(y_test)):print(y_test[i], '\t', y_pred[i], '\n')# show LDA resultfeature_names = cntVector.get_feature_names()print_top_words(lda, feature_names, 10)# show SVM resultdraw_svm_result(X, y, svm_model)

运行结果

1.笑傲江湖/神雕侠侣/ 射雕英雄传

结果评估:

Precision:0.962Precision:0.962Precision:0.962

Recall:0.953Recall:0.953Recall:0.953

F1:0.956F1:0.956F1:0.956

SVM依据LDA降频后特征的分类结果:

主题关键字:

Topic #0:
令狐冲 师父 剑法 岳不群 弟子 田伯光 仪琳 师妹 长剑 便是
Topic #1:
杨过 小龙女 李莫愁 陆无双 师父 武功 当下 心中 功夫 弟子
Topic #2:
郭靖 黄蓉 欧阳锋 丘处机 师父 心中 两人 黄药师 武功 心想

完整代码

https://github.com/AngeloG98/TopicModelLda

【NLP】主题模型文本分类相关推荐

  1. R语言-文本挖掘 主题模型 文本分类

    ####需要先安装几个R包,如果有这些包,可省略安装包的步骤. #install.packages("Rwordseg") #install.packages("tm&q ...

  2. 零基础入门NLP - 天池新闻文本分类Task3笔记

    零基础入门NLP - 天池新闻文本分类 以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记 赛题链接:https://tianchi.aliyun.com/co ...

  3. R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数、交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能

    R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数.交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能 ...

  4. BERTopic:NLP主题模型的未来!

    文| ZenMoore 编| 小轶 以前我一直以为,主题建模(提取文档的主题词)这种机器学习时代就开始研究的基础工具,现在肯定已经到头了,虽然...有时效果可能不是那么让人满意. 但突然看到一则推文: ...

  5. 百度开源其NLP主题模型工具包,文本分类等场景可直接使用L——LDA进行主题选择本质就是降维,然后用于推荐或者分类...

    2017年7月4日,百度开源了一款主题模型项目,名曰:Familia. InfoQ记者第一时间联系到百度Familia项目负责人姜迪并对他进行采访,在本文中,他将为我们解析Familia项目的技术细节 ...

  6. 自然语言处理(NLP):06 word2vec训练中文模型-文本分类

    本章节主要研究内容:基于word2vec 提取特征 + 文本分类 finetune 就是用别人训练好的模型,加上我们自己的数据,来训练新的模型.finetune相当于使用别人的模型的前几层,来提取浅层 ...

  7. 【nlp自然语言处理实战】案例---FastText模型文本分类

    目录 1.案例简介 2 代码 2.1 load_data.py 2.2 load_data_iter.py 2.3 FastText.py 2.4 train.py 2.5 predict.py 2. ...

  8. NLP自然语言处理——文本分类(CNN卷积神经网络)

    文本分类是NLP自然语言处理中一项基本功能,它在新闻分类.主题分类.问答匹配.意图识别.情感分类.推断等领域都有涉及. 学习应用文本分类任务的难点有被识别语言的复杂性和评测函数的设计等,本篇将介绍一个 ...

  9. 零基础入门NLP之新闻文本分类挑战赛——赛题理解

    假期还有两周左右就结束了,正巧,Datawhale联合天池发布了零基础入门NLP的学习,于是报名参加了零基础入门NLP-新闻文本分类. 本人之前刚接触NLP没多久,记录一下学习的历程,供和我一样的小白 ...

最新文章

  1. 蚂蚁的金融交易系统架构
  2. 反转链表:输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。...
  3. python中删除对象方法的区别_python中delattr删除对象方法的代码分析
  4. C 语言里的字符串---字符数组
  5. 5G NR PUCCH资源配置
  6. 14-运算符(比较、三元、逻辑)14-运算符(比较、三元、逻辑)
  7. 会打乒乓球的机器人!
  8. (stl排序+检索)大理石在哪
  9. iPhone SE 2生产无限期推迟,苹果决定推迟3月份产品发布会
  10. grafa导出数据图标_第5章 数据与可视化 - Grafana与数据可视化 - 《Prometheus操作指南》 - 书栈网 · BookStack...
  11. python unrar问题_Python提取/unrar RAR文件错误
  12. 使用nvidia-nsight编译器开发C/C++以及cuda编程
  13. 标识解析数据网关IDG S800发布上线
  14. java中如何确定表的列宽,excel列宽怎么设置_javaexcel怎么设置所有列宽
  15. python输入数字输出月份英文缩写_英文和数字表示的月份,如何在 Excel 中相互转换?...
  16. 操作系统实验二:银行家算法
  17. Excel如何统计单元格中姓名个数
  18. webflux之reactor-Subscriber
  19. 智慧民航新业态崭露头角,图扑数字孪生入局民航飞联网
  20. Ubuntu因显卡驱动原因无法启动

热门文章

  1. Vue.js实现文字超出指定高度后展开收起功能
  2. 开源堡垒机JumpServer的资产及用户配置说明
  3. 网站做好后不能用手机浏览吗_企业的网站建设如何跟上时代的发展?
  4. 《PPT高手之道:六步变身职场幻灯派》一1.1 分析听众——知己知彼
  5. Python高级特性与网络爬虫(二):使用Selenium自动化测试工具爬取一号店商品信息
  6. 【转】图灵机与计算问题(张江)
  7. 手把手教您搞定用户画像(战略解读|建模体系|维度分解|应用流程)
  8. Erp 公司系列:QAD
  9. python+OpenCv笔记(七):图像的形态学操作(腐蚀与膨胀、开闭运算、礼帽与黑帽)
  10. Bugku-清凉一夏