{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# sklearn-LDA" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "代码示例:https://mp.weixin.qq.com/s/hMcJtB3Lss1NBalXRTGZlQ (玉树芝兰)
\n", "可视化:https://blog.csdn.net/qq_39496504/article/details/107125284
\n", "sklearn lda参数解读:https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html\n", "
中文版参数解读:https://blog.csdn.net/TiffanyRabbit/article/details/76445909\n", "
LDA原理-视频版:https://www.bilibili.com/video/BV1t54y127U8\n", "
LDA原理-文字版:https://www.jianshu.com/p/5c510694c07e\n", "
score的计算方法:https://github.com/scikit-learn/scikit-learn/blob/844b4be24d20fc42cc13b957374c718956a0db39/sklearn/decomposition/_lda.py#L729\n", "
主题困惑度1:https://blog.csdn.net/weixin_43343486/article/details/109255165\n", "
主题困惑度2:https://blog.csdn.net/weixin_39676021/article/details/112187210" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.预处理" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import os\n", "import pandas as pd\n", "import re\n", "import jieba\n", "import jieba.posseg as psg" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "output_path = r'G:\\Desktop\\social\\BigHomework\\result'\n", "file_path = r'G:\\Desktop\\AI\\LDA\\weibo_data\\weibo_data_preprocessed.csv'\n", "data=pd.read_csv(file_path).astype(str)#content type\n", "stop_file = r\"G:\\Desktop\\AI\\LDA\\data\\stop_words.txt\"" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# 中文分词,使用jieba分词,只保留名词/动名词\n", "def chinese_word_cut(mytext):\n", " try:\n", " stopword_list = open(stop_file,encoding ='utf-8')\n", " except:\n", " stopword_list = []\n", " print(\"error in stop_file\")\n", " stop_list = []\n", " flag_list = ['n','nz','vn']\n", " for line in stopword_list:\n", " line = re.sub(u'\\n|\\\\r', '', line)\n", " stop_list.append(line)\n", " \n", " word_list = []\n", " #jieba分词\n", " seg_list = psg.cut(mytext)\n", " for seg_word in seg_list:\n", " # 只保留中文\n", " word = re.sub(u'[^\\u4e00-\\u9fa5]','',seg_word.word)\n", " find = 0\n", " for stop_word in stop_list:\n", " if stop_word == word or len(word)<2: #this word is stopword\n", " find = 1\n", " break\n", " if find == 0 and seg_word.flag in flag_list:\n", " word_list.append(word) \n", " return (\" \").join(word_list)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
博主昵称微博认证content发布时间转发评论
0辣子鸡谁做的好吃nan好像可以在自己幻想的元宇宙里过一辈子好像已经过完了一辈子双鱼座的脑子要不得01月10日 23:59000
1远古的刀nan反正闭关锁宇宙我们将会面临下一次的闭关锁国融入不了全球经济王峻涛6688跟你们讲我相信这个元...01月10日 23:583230
2暮景烟_深浅nan周深先生之夜元宇宙周深拥有了生米就像拥有了梦的翅膀卡布叻_周深放心飞吧生米永相随cp时尚先生...01月10日 23:58000
3东辉毅恒传媒nan王峻涛6688其实吧你有空可以再看看这个视频跟你们讲我相信这个元宇宙真的会来虽然不是一下子就...01月10日 23:57000
4在寒蝉鸣泣中等待夏日重现nan敬元宇宙L让基尔希斯坦的女朋友的微博视频01月10日 23:57005
\n", "
" ], "text/plain": [ " 博主昵称 微博认证 content \\\n", "0 辣子鸡谁做的好吃 nan 好像可以在自己幻想的元宇宙里过一辈子好像已经过完了一辈子双鱼座的脑子要不得 \n", "1 远古的刀 nan 反正闭关锁宇宙我们将会面临下一次的闭关锁国融入不了全球经济王峻涛6688跟你们讲我相信这个元... \n", "2 暮景烟_深浅 nan 周深先生之夜元宇宙周深拥有了生米就像拥有了梦的翅膀卡布叻_周深放心飞吧生米永相随cp时尚先生... \n", "3 东辉毅恒传媒 nan 王峻涛6688其实吧你有空可以再看看这个视频跟你们讲我相信这个元宇宙真的会来虽然不是一下子就... \n", "4 在寒蝉鸣泣中等待夏日重现 nan 敬元宇宙L让基尔希斯坦的女朋友的微博视频 \n", "\n", " 发布时间 转发 评论 赞 \n", "0 01月10日 23:59 0 0 0 \n", "1 01月10日 23:58 32 3 0 \n", "2 01月10日 23:58 0 0 0 \n", "3 01月10日 23:57 0 0 0 \n", "4 01月10日 23:57 0 0 5 " ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "data[\"content\"] = data.content.apply(chinese_word_cut)\n", "data.to_csv('weibi_data_keywords.csv')" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'data' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mg:\\Desktop\\AI\\LDA\\LDAsklearn_origin.ipynb Cell 9'\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m data\u001b[39m.\u001b[39mhead()\n", "\u001b[1;31mNameError\u001b[0m: name 'data' is not defined" ] } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.LDA分析" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer\n", "from sklearn.decomposition import LatentDirichletAllocation\n", "import os\n", "import pandas as pd\n", "import re\n", "import jieba\n", "import jieba.posseg as psg\n", "\n", "data = pd.read_csv(r'G:\\Desktop\\AI\\LDA\\weibi_data_keywords.csv').astype(str)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "def print_top_words(model, feature_names, n_top_words):\n", " tword = []\n", " for topic_idx, topic in enumerate(model.components_):\n", " print(\"Topic #%d:\" % topic_idx)\n", " topic_w = \" \".join([feature_names[i] for i in topic.argsort()[:-n_top_words - 1:-1]])\n", " tword.append(topic_w)\n", " print(topic_w)\n", " return tword" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "n_features = 1000 #提取1000个特征词语\n", "tf_vectorizer = CountVectorizer(strip_accents = 'unicode',\n", " max_features=n_features,\n", " stop_words='english',\n", " max_df = 0.5,\n", " min_df = 10)\n", "tf = tf_vectorizer.fit_transform(data.content)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "n_features = 1000\n", "tf_vectorizer1 = TfidfVectorizer(strip_accents = 'unicode',\n", " max_features=n_features,\n", " stop_words='english',\n", " max_df = 0.5,\n", " min_df = 10)\n", "tf1 = tf_vectorizer1.fit_transform(data.content)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LatentDirichletAllocation(learning_offset=50, max_iter=100, n_components=5,\n", " random_state=0)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n_topics = 5\n", "lda1 = LatentDirichletAllocation(n_components=n_topics, max_iter=100,\n", " learning_method='batch',\n", " learning_offset=50,\n", "# doc_topic_prior=0.1,\n", "# topic_word_prior=0.01,\n", " random_state=0)\n", "lda1.fit(tf1)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'lda1' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mg:\\Desktop\\AI\\LDA\\LDAsklearn_origin.ipynb Cell 16'\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m lda1\n", "\u001b[1;31mNameError\u001b[0m: name 'lda1' is not defined" ] } ], "source": [ "lda1" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LatentDirichletAllocation(learning_offset=50, max_iter=50, n_components=8,\n", " random_state=0)" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "n_topics = 8\n", "lda = LatentDirichletAllocation(n_components=n_topics, max_iter=50,\n", " learning_method='batch',\n", " learning_offset=50,\n", "# doc_topic_prior=0.1,\n", "# topic_word_prior=0.01,\n", " random_state=0)\n", "lda.fit(tf)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1输出每个主题对应词语 " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'tf_vectorizer' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mg:\\Desktop\\AI\\LDA\\LDAsklearn_origin.ipynb Cell 19'\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m n_top_words \u001b[39m=\u001b[39m \u001b[39m25\u001b[39m\n\u001b[1;32m----> 2\u001b[0m tf_feature_names \u001b[39m=\u001b[39m tf_vectorizer\u001b[39m.\u001b[39mget_feature_names()\n\u001b[0;32m 3\u001b[0m topic_word \u001b[39m=\u001b[39m print_top_words(lda, tf_feature_names, n_top_words)\n\u001b[0;32m 4\u001b[0m tf_feature_names1 \u001b[39m=\u001b[39m tf_vectorizer1\u001b[39m.\u001b[39mget_feature_names()\n", "\u001b[1;31mNameError\u001b[0m: name 'tf_vectorizer' is not defined" ] } ], "source": [ "n_top_words = 25\n", "tf_feature_names = tf_vectorizer.get_feature_names()\n", "topic_word = print_top_words(lda, tf_feature_names, n_top_words)\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Topic #0:\n", "世界 数字 藏品 人类 艺术 回家 视频 现实 生活 星球 时代 虚拟世界 老师 电影 时间 作品 图片 感觉 代言人 空间 科幻 科技 体验 玩家 概念\n", "Topic #1:\n", "区块 游戏 手游 项目 社区 以太 货币 币圈 链元 链接 网页 链游 合约 海盗 财经 狗狗 上线 交易 视频 数字 土地 计划 生态 代币 行情\n", "Topic #2:\n", "板块 股份 市场 个股 资金 概念 指数 股票 龙头 机会 行情 新能源 方向 题材 科技 大盘 调整 文章 趋势 医药 热点 预期 走势 股市 创业板\n", "Topic #3:\n", "链接 网页 时尚 抽奖 话题 平台 粉丝 感觉 概念 官方 新品 评论 舞台 和元 朋友 发布会 体验 玩法 商标 音乐 直播 星辰 小伙伴 女王 口罩\n", "Topic #4:\n", "公司 视频 技术 科技 发展 互联网 游戏 概念 数字 产品 投资 产业 领域 行业 经济 企业 平台 社交 世界 全球 腾讯 新闻 布局 现实 内容\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\31897\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function get_feature_names is deprecated; get_feature_names is deprecated in 1.0 and will be removed in 1.2. Please use get_feature_names_out instead.\n", " warnings.warn(msg, category=FutureWarning)\n" ] } ], "source": [ "n_top_words = 25\n", "tf_feature_names1 = tf_vectorizer1.get_feature_names()\n", "topic_word = print_top_words(lda1, tf_feature_names1, n_top_words)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2输出每篇文章对应主题 " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "topics=lda1.transform(tf1)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "NameError", "evalue": "name 'lda' is not defined", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mg:\\Desktop\\AI\\LDA\\LDAsklearn_origin.ipynb Cell 24'\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m lda\n", "\u001b[1;31mNameError\u001b[0m: name 'lda' is not defined" ] } ], "source": [ "lda" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "topic = []\n", "for t in topics:\n", " topic.append(\"Topic #\"+str(list(t).index(np.max(t))))\n", "data['概率最大的主题序号']=topic\n", "data['每个主题对应概率']=list(topics)\n", "data.to_excel(\"data_topic_tfidf.xlsx\",index=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3可视化 " ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "import pyLDAvis\n", "import pyLDAvis.sklearn" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "c:\\Users\\31897\\anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:87: FutureWarning: Function get_feature_names is deprecated; get_feature_names is deprecated in 1.0 and will be removed in 1.2. Please use get_feature_names_out instead.\n", " warnings.warn(msg, category=FutureWarning)\n", "c:\\Users\\31897\\anaconda3\\lib\\site-packages\\pyLDAvis\\_prepare.py:246: FutureWarning: In a future version of pandas all arguments of DataFrame.drop except for the argument 'labels' will be keyword-only.\n", " default_term_info = default_term_info.sort_values(\n" ] }, { "data": { "text/html": [ "\n", "\n", "\n", "\n", "
\n", "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pyLDAvis.enable_notebook()\n", "pic = pyLDAvis.sklearn.prepare(lda1, tf1, tf_vectorizer1)\n", "pyLDAvis.display(pic)\n", "pyLDAvis.save_html(pic, 'lda_pass'+str(n_topics)+'.html')\n", "pyLDAvis.display(pic)\n", "#去工作路径下找保存好的html文件\n", "#和视频里讲的不一样,目前这个代码不需要手动中断运行,可以快速出结果" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4困惑度 " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n", "10\n", "11\n", "12\n", "13\n", "14\n", "15\n" ] } ], "source": [ "plexs = []\n", "scores = []\n", "n_max_topics = 16\n", "for i in range(1,n_max_topics):\n", " print(i)\n", " lda2 = LatentDirichletAllocation(n_components=i, max_iter=50,\n", " learning_method='batch',\n", " learning_offset=50,random_state=0)\n", " lda2.fit(tf1)\n", " plexs.append(lda2.perplexity(tf1))\n", " scores.append(lda2.score(tf1))" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "n_t=15#区间最右侧的值。注意:不能大于n_max_topics\n", "x=list(range(1,n_t+1))\n", "plt.plot(x,plexs[0:n_t])\n", "plt.xlabel(\"number of topics\")\n", "plt.ylabel(\"perplexity\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "8ad04bb091a50ccdbc721be5657843c2a9a7fbc3dc3147e11dd611d30683dae8" }, "kernelspec": { "display_name": "Python 3.8.3 ('base')", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": { "height": "303.324px", "left": "114px", "top": "110.322px", "width": "165px" }, "toc_section_display": true, "toc_window_display": true } }, "nbformat": 4, "nbformat_minor": 2 }