Skip to content

Instantly share code, notes, and snippets.

@yssymmt
Created September 19, 2022 14:56
Show Gist options
  • Save yssymmt/5b7b4b35ba3d6eee6a3e1a7a38d5cb20 to your computer and use it in GitHub Desktop.
Save yssymmt/5b7b4b35ba3d6eee6a3e1a7a38d5cb20 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"id": "bb9d6d07",
"metadata": {},
"source": [
"#09: ldagensim"
]
},
{
"cell_type": "markdown",
"id": "fc3659bb",
"metadata": {},
"source": [
"####ライブラリの読み込み"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "6ed72d35",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import numpy as np\n",
"from sqlalchemy import create_engine\n",
"import teradatasql\n",
"import teradatasqlalchemy\n",
"from gensim.corpora.dictionary import Dictionary\n",
"from gensim.models import LdaModel, CoherenceModel\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "markdown",
"id": "965abb95",
"metadata": {},
"source": [
"####Teradataへの接続、sqlalchemy エンジンを作成"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "0d574bf5",
"metadata": {},
"outputs": [],
"source": [
"host = \"192.168.999.999\"\n",
"user = \"jumbo\"\n",
"password = \"mambo\"\n",
"connstr = \"teradatasql://{user}:{password}@{host}\".format(host=host, user=user, password=password)\n",
"engine = create_engine(connstr)"
]
},
{
"cell_type": "markdown",
"id": "724f9202",
"metadata": {},
"source": [
"####学習データの取得"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "ab927108",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>docid</th>\n",
" <th>word</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>若槻千夏 幾つ テレビ 番組 司会 務める 本番 以外 人見知り 話す ない</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>漫才 ツッコミ 担当 たりないふたり ボケ 担当</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>ナナメ 夕暮れ 他 本 出す</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>深夜 一人 バスケットボール スリーポイント 練習</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>プライベート バスケットボール 足 怪我</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>6</td>\n",
" <td>星野源 日本 テレビ 界 希望 思う</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>7</td>\n",
" <td>藤井青銅 ピンク ベスト じゃない方 しゃべれる</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>8</td>\n",
" <td>mc waka 日本武道館 横浜アリーナ 人 歌 ラップ 茶々 入れる</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>9</td>\n",
" <td>茶々 名前 チワワ 犬 飼う</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>10</td>\n",
" <td>結婚 直前 浮気 ばれる</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>11</td>\n",
" <td>六本木 社長 モンクレール ダウン もらう</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>12</td>\n",
" <td>ピンク ベスト 着る 胸 張る トゥース 大声 叫ぶ</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>13</td>\n",
" <td>ピンク セーター 着る 後輩 芸人 すいません ピンク 着 もらう 挨拶</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>14</td>\n",
" <td>漫才 ボケ 担当 ラジオ テレビ ボケ ない</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>15</td>\n",
" <td>普段 靴下 履く ない 足 裏 象 よう</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>16</td>\n",
" <td>バカリズム 存在 面白い ウケる スベる ない</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>17</td>\n",
" <td>山里亮太 ツッコミ 敵わ ない 思う</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>18</td>\n",
" <td>入船 出身 築地 出身 嘘 地元 人 お前 入船 ツッコミ</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>19</td>\n",
" <td>ぼる塾 人 トゥース 掛け合い 面白い</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>20</td>\n",
" <td>スベる 芸風 スベる 怖い 思う</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" docid word\n",
"0 1 若槻千夏 幾つ テレビ 番組 司会 務める 本番 以外 人見知り 話す ない\n",
"1 2 漫才 ツッコミ 担当 たりないふたり ボケ 担当\n",
"2 3 ナナメ 夕暮れ 他 本 出す\n",
"3 4 深夜 一人 バスケットボール スリーポイント 練習\n",
"4 5 プライベート バスケットボール 足 怪我\n",
"5 6 星野源 日本 テレビ 界 希望 思う\n",
"6 7 藤井青銅 ピンク ベスト じゃない方 しゃべれる\n",
"7 8 mc waka 日本武道館 横浜アリーナ 人 歌 ラップ 茶々 入れる\n",
"8 9 茶々 名前 チワワ 犬 飼う\n",
"9 10 結婚 直前 浮気 ばれる\n",
"10 11 六本木 社長 モンクレール ダウン もらう\n",
"11 12 ピンク ベスト 着る 胸 張る トゥース 大声 叫ぶ\n",
"12 13 ピンク セーター 着る 後輩 芸人 すいません ピンク 着 もらう 挨拶\n",
"13 14 漫才 ボケ 担当 ラジオ テレビ ボケ ない\n",
"14 15 普段 靴下 履く ない 足 裏 象 よう\n",
"15 16 バカリズム 存在 面白い ウケる スベる ない\n",
"16 17 山里亮太 ツッコミ 敵わ ない 思う\n",
"17 18 入船 出身 築地 出身 嘘 地元 人 お前 入船 ツッコミ\n",
"18 19 ぼる塾 人 トゥース 掛け合い 面白い\n",
"19 20 スベる 芸風 スベる 怖い 思う"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"with engine.connect() as conn:\n",
" train = pd.read_sql(\"\"\"\n",
" select \n",
" docid, word \n",
" from jumbo.aud11_denorm \n",
" order by docid \n",
" \"\"\", conn)\n",
"train"
]
},
{
"cell_type": "markdown",
"id": "b4cd6824",
"metadata": {},
"source": [
"####テキスト列の抽出"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "1b79be41",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 若槻千夏 幾つ テレビ 番組 司会 務める 本番 以外 人見知り 話す ない\n",
"1 漫才 ツッコミ 担当 たりないふたり ボケ 担当\n",
"2 ナナメ 夕暮れ 他 本 出す\n",
"3 深夜 一人 バスケットボール スリーポイント 練習\n",
"4 プライベート バスケットボール 足 怪我\n",
"5 星野源 日本 テレビ 界 希望 思う\n",
"6 藤井青銅 ピンク ベスト じゃない方 しゃべれる\n",
"7 mc waka 日本武道館 横浜アリーナ 人 歌 ラップ 茶々 入れる\n",
"8 茶々 名前 チワワ 犬 飼う\n",
"9 結婚 直前 浮気 ばれる\n",
"10 六本木 社長 モンクレール ダウン もらう\n",
"11 ピンク ベスト 着る 胸 張る トゥース 大声 叫ぶ\n",
"12 ピンク セーター 着る 後輩 芸人 すいません ピンク 着 もらう 挨拶\n",
"13 漫才 ボケ 担当 ラジオ テレビ ボケ ない\n",
"14 普段 靴下 履く ない 足 裏 象 よう\n",
"15 バカリズム 存在 面白い ウケる スベる ない\n",
"16 山里亮太 ツッコミ 敵わ ない 思う\n",
"17 入船 出身 築地 出身 嘘 地元 人 お前 入船 ツッコミ\n",
"18 ぼる塾 人 トゥース 掛け合い 面白い\n",
"19 スベる 芸風 スベる 怖い 思う\n",
"Name: word, dtype: object"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"texta = train['word']\n",
"texta"
]
},
{
"cell_type": "markdown",
"id": "fa9593eb",
"metadata": {},
"source": [
"####中のデータを配列に変換"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "543313b1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[['若槻千夏', '幾つ', 'テレビ', '番組', '司会', '務める', '本番', '以外', '人見知り', '話す', 'ない'],\n",
" ['漫才', 'ツッコミ', '担当', 'たりないふたり', 'ボケ', '担当'],\n",
" ['ナナメ', '夕暮れ', '他', '本', '出す'],\n",
" ['深夜', '一人', 'バスケットボール', 'スリーポイント', '練習'],\n",
" ['プライベート', 'バスケットボール', '足', '怪我'],\n",
" ['星野源', '日本', 'テレビ', '界', '希望', '思う'],\n",
" ['藤井青銅', 'ピンク', 'ベスト', 'じゃない方', 'しゃべれる'],\n",
" ['mc', 'waka', '日本武道館', '横浜アリーナ', '人', '歌', 'ラップ', '茶々', '入れる'],\n",
" ['茶々', '名前', 'チワワ', '犬', '飼う'],\n",
" ['結婚', '直前', '浮気', 'ばれる'],\n",
" ['六本木', '社長', 'モンクレール', 'ダウン', 'もらう'],\n",
" ['ピンク', 'ベスト', '着る', '胸', '張る', 'トゥース', '大声', '叫ぶ'],\n",
" ['ピンク', 'セーター', '着る', '後輩', '芸人', 'すいません', 'ピンク', '着', 'もらう', '挨拶'],\n",
" ['漫才', 'ボケ', '担当', 'ラジオ', 'テレビ', 'ボケ', 'ない'],\n",
" ['普段', '靴下', '履く', 'ない', '足', '裏', '象', 'よう'],\n",
" ['バカリズム', '存在', '面白い', 'ウケる', 'スベる', 'ない'],\n",
" ['山里亮太', 'ツッコミ', '敵わ', 'ない', '思う'],\n",
" ['入船', '出身', '築地', '出身', '嘘', '地元', '人', 'お前', '入船', 'ツッコミ'],\n",
" ['ぼる塾', '人', 'トゥース', '掛け合い', '面白い'],\n",
" ['スベる', '芸風', 'スベる', '怖い', '思う']]"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"texta = [word.split(\" \") for word in texta]\n",
"texta"
]
},
{
"cell_type": "markdown",
"id": "c29e63ae",
"metadata": {},
"source": [
"####辞書の作成(単語と単語IDの対応)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "364ab4b8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<gensim.corpora.dictionary.Dictionary at 0x1bcfad2d7c0>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dictionary = Dictionary(texta)\n",
"dictionary"
]
},
{
"cell_type": "markdown",
"id": "0c152aec",
"metadata": {},
"source": [
"####辞書の件数確認"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "419c4a29",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"97"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(dictionary)"
]
},
{
"cell_type": "markdown",
"id": "3f40adb2",
"metadata": {},
"source": [
"####辞書の中身を見る"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "475101fd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'入船'"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dictionary[88]"
]
},
{
"cell_type": "markdown",
"id": "84fd481c",
"metadata": {},
"source": [
"####コーパスの作成、(単語id,bow),のようなbow形式に"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "c5502ac7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[[(0, 1),\n",
" (1, 1),\n",
" (2, 1),\n",
" (3, 1),\n",
" (4, 1),\n",
" (5, 1),\n",
" (6, 1),\n",
" (7, 1),\n",
" (8, 1),\n",
" (9, 1),\n",
" (10, 1)],\n",
" [(11, 1), (12, 1), (13, 1), (14, 2), (15, 1)],\n",
" [(16, 1), (17, 1), (18, 1), (19, 1), (20, 1)],\n",
" [(21, 1), (22, 1), (23, 1), (24, 1), (25, 1)],\n",
" [(22, 1), (26, 1), (27, 1), (28, 1)],\n",
" [(1, 1), (29, 1), (30, 1), (31, 1), (32, 1), (33, 1)],\n",
" [(34, 1), (35, 1), (36, 1), (37, 1), (38, 1)],\n",
" [(39, 1),\n",
" (40, 1),\n",
" (41, 1),\n",
" (42, 1),\n",
" (43, 1),\n",
" (44, 1),\n",
" (45, 1),\n",
" (46, 1),\n",
" (47, 1)],\n",
" [(47, 1), (48, 1), (49, 1), (50, 1), (51, 1)],\n",
" [(52, 1), (53, 1), (54, 1), (55, 1)],\n",
" [(56, 1), (57, 1), (58, 1), (59, 1), (60, 1)],\n",
" [(36, 1), (37, 1), (61, 1), (62, 1), (63, 1), (64, 1), (65, 1), (66, 1)],\n",
" [(36, 2),\n",
" (56, 1),\n",
" (65, 1),\n",
" (67, 1),\n",
" (68, 1),\n",
" (69, 1),\n",
" (70, 1),\n",
" (71, 1),\n",
" (72, 1)],\n",
" [(0, 1), (1, 1), (13, 2), (14, 1), (15, 1), (73, 1)],\n",
" [(0, 1), (28, 1), (74, 1), (75, 1), (76, 1), (77, 1), (78, 1), (79, 1)],\n",
" [(0, 1), (80, 1), (81, 1), (82, 1), (83, 1), (84, 1)],\n",
" [(0, 1), (12, 1), (30, 1), (85, 1), (86, 1)],\n",
" [(12, 1), (42, 1), (87, 1), (88, 2), (89, 2), (90, 1), (91, 1), (92, 1)],\n",
" [(42, 1), (61, 1), (84, 1), (93, 1), (94, 1)],\n",
" [(30, 1), (81, 2), (95, 1), (96, 1)]]"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"corpus = [dictionary.doc2bow(word) for word in texta]\n",
"corpus"
]
},
{
"cell_type": "markdown",
"id": "3017fd7b",
"metadata": {},
"source": [
"####CoherenceとPreplexityの計算(もうまるパクリで)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"id": "a2f3c1c6",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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",
"text/plain": [
"<Figure size 648x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"def compute_metrics(model, texta, corpus, dictionary):\n",
" # Perplexity算出\n",
" pp = np.exp2(-model.log_perplexity(corpus))\n",
" \n",
" # Coherenceの算出\n",
" cm = CoherenceModel(model=model, texts=texta, dictionary=dictionary, coherence='u_mass')\n",
" ch = cm.get_coherence()\n",
" \n",
" return pp, ch\n",
" \n",
"# トピック数を1から20まで1ずつ増やしてPerplexityとCoherenceを算出\n",
"perplexity = []\n",
"coherence = []\n",
"num_topic_range = range(1, 20, 1)\n",
"for num_topics in num_topic_range:\n",
" model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics, minimum_probability=0.0, random_state=0)\n",
" pp, ch = compute_metrics(model, texta, corpus, dictionary)\n",
" perplexity.append(pp)\n",
" coherence.append(ch)\n",
" \n",
"metrics = pd.DataFrame({'num_topic': num_topic_range, 'perplexity': perplexity, 'coherence': coherence})\n",
" \n",
"# PerplexityとCoherenceをグラフ化\n",
"fig, ax1 = plt.subplots(figsize=(9, 6))\n",
"metrics.plot(x='num_topic', y='perplexity', color='b', legend=False, ax=ax1)\n",
"ax1.set_xlabel('num_topics')\n",
"ax1.set_ylabel('perplexity', color='b')\n",
"ax1.tick_params('y', colors='b')\n",
" \n",
"ax2 = ax1.twinx()\n",
"metrics.plot(x='num_topic', y='coherence', color='r', legend=False, ax=ax2)\n",
"ax2.set_ylabel('coherence', color='r')\n",
"ax2.tick_params('y', colors='r')\n",
" \n",
"fig.tight_layout()\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"id": "ac93915d",
"metadata": {},
"source": [
"####モデル学習、トピック数は5で"
]
},
{
"cell_type": "code",
"execution_count": 11,
"id": "f081298d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<gensim.models.ldamodel.LdaModel at 0x1bca6c8c610>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lda = LdaModel(corpus, num_topics=5, id2word = dictionary)\n",
"lda"
]
},
{
"cell_type": "markdown",
"id": "134556a2",
"metadata": {},
"source": [
"####辞書からすべてIDと単語を取得する"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "6ba6d9bf",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'ない': 0,\n",
" 'テレビ': 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",
" 'ナナメ': 16,\n",
" '他': 17,\n",
" '出す': 18,\n",
" '夕暮れ': 19,\n",
" '本': 20,\n",
" 'スリーポイント': 21,\n",
" 'バスケットボール': 22,\n",
" '一人': 23,\n",
" '深夜': 24,\n",
" '練習': 25,\n",
" 'プライベート': 26,\n",
" '怪我': 27,\n",
" '足': 28,\n",
" '希望': 29,\n",
" '思う': 30,\n",
" '日本': 31,\n",
" '星野源': 32,\n",
" '界': 33,\n",
" 'しゃべれる': 34,\n",
" 'じゃない方': 35,\n",
" 'ピンク': 36,\n",
" 'ベスト': 37,\n",
" '藤井青銅': 38,\n",
" 'mc': 39,\n",
" 'waka': 40,\n",
" 'ラップ': 41,\n",
" '人': 42,\n",
" '入れる': 43,\n",
" '日本武道館': 44,\n",
" '横浜アリーナ': 45,\n",
" '歌': 46,\n",
" '茶々': 47,\n",
" 'チワワ': 48,\n",
" '名前': 49,\n",
" '犬': 50,\n",
" '飼う': 51,\n",
" 'ばれる': 52,\n",
" '浮気': 53,\n",
" '直前': 54,\n",
" '結婚': 55,\n",
" 'もらう': 56,\n",
" 'ダウン': 57,\n",
" 'モンクレール': 58,\n",
" '六本木': 59,\n",
" '社長': 60,\n",
" 'トゥース': 61,\n",
" '叫ぶ': 62,\n",
" '大声': 63,\n",
" '張る': 64,\n",
" '着る': 65,\n",
" '胸': 66,\n",
" 'すいません': 67,\n",
" 'セーター': 68,\n",
" '後輩': 69,\n",
" '挨拶': 70,\n",
" '着': 71,\n",
" '芸人': 72,\n",
" 'ラジオ': 73,\n",
" 'よう': 74,\n",
" '履く': 75,\n",
" '普段': 76,\n",
" '裏': 77,\n",
" '象': 78,\n",
" '靴下': 79,\n",
" 'ウケる': 80,\n",
" 'スベる': 81,\n",
" 'バカリズム': 82,\n",
" '存在': 83,\n",
" '面白い': 84,\n",
" '山里亮太': 85,\n",
" '敵わ': 86,\n",
" 'お前': 87,\n",
" '入船': 88,\n",
" '出身': 89,\n",
" '嘘': 90,\n",
" '地元': 91,\n",
" '築地': 92,\n",
" 'ぼる塾': 93,\n",
" '掛け合い': 94,\n",
" '怖い': 95,\n",
" '芸風': 96}"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dictionary.token2id"
]
},
{
"cell_type": "markdown",
"id": "6cd87ef0",
"metadata": {},
"source": [
"####辞書をデータフレームに"
]
},
{
"cell_type": "code",
"execution_count": 13,
"id": "5cc17f17",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>word</th>\n",
" <th>wordid</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ない</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>テレビ</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>人見知り</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>以外</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>務める</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92</th>\n",
" <td>築地</td>\n",
" <td>92</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93</th>\n",
" <td>ぼる塾</td>\n",
" <td>93</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>掛け合い</td>\n",
" <td>94</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>怖い</td>\n",
" <td>95</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>芸風</td>\n",
" <td>96</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>97 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" word wordid\n",
"0 ない 0\n",
"1 テレビ 1\n",
"2 人見知り 2\n",
"3 以外 3\n",
"4 務める 4\n",
".. ... ...\n",
"92 築地 92\n",
"93 ぼる塾 93\n",
"94 掛け合い 94\n",
"95 怖い 95\n",
"96 芸風 96\n",
"\n",
"[97 rows x 2 columns]"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d2={}\n",
"for k,v in dictionary.token2id.items():\n",
" d2[k]=pd.Series(v)\n",
"\n",
"dfa=pd.DataFrame(d2)\n",
"dfaa = dfa.T\n",
"dfaa.reset_index(inplace=True)\n",
"dfaa = dfaa.rename(columns={'index': 'word'})\n",
"dfaa = dfaa.rename(columns={0: 'wordid'})\n",
"dfaa"
]
},
{
"cell_type": "markdown",
"id": "569895e1",
"metadata": {},
"source": [
"####モデルの単語に対する評価、10個しかでてこない"
]
},
{
"cell_type": "code",
"execution_count": 14,
"id": "33d53e5f",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(0,\n",
" '0.062*\"人\" + 0.043*\"出身\" + 0.043*\"入船\" + 0.043*\"トゥース\" + 0.023*\"ピンク\" + 0.023*\"ツッコミ\" + 0.023*\"茶々\" + 0.023*\"お前\" + 0.023*\"ベスト\" + 0.023*\"mc\"'),\n",
" (1,\n",
" '0.030*\"思う\" + 0.030*\"ベスト\" + 0.030*\"テレビ\" + 0.030*\"日本\" + 0.030*\"ナナメ\" + 0.030*\"本\" + 0.030*\"藤井青銅\" + 0.030*\"界\" + 0.030*\"ピンク\" + 0.030*\"もらう\"'),\n",
" (2,\n",
" '0.062*\"担当\" + 0.034*\"ない\" + 0.034*\"スベる\" + 0.034*\"漫才\" + 0.034*\"存在\" + 0.034*\"バカリズム\" + 0.034*\"ボケ\" + 0.034*\"ウケる\" + 0.034*\"たりないふたり\" + 0.034*\"面白い\"'),\n",
" (3,\n",
" '0.048*\"ボケ\" + 0.048*\"ない\" + 0.048*\"思う\" + 0.048*\"スベる\" + 0.026*\"担当\" + 0.026*\"テレビ\" + 0.026*\"ラジオ\" + 0.026*\"ツッコミ\" + 0.026*\"茶々\" + 0.026*\"バスケットボール\"'),\n",
" (4,\n",
" '0.041*\"ピンク\" + 0.041*\"ない\" + 0.022*\"テレビ\" + 0.022*\"足\" + 0.022*\"もらう\" + 0.022*\"後輩\" + 0.022*\"本番\" + 0.022*\"挨拶\" + 0.022*\"セーター\" + 0.022*\"幾つ\"')]"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lda.show_topics()"
]
},
{
"cell_type": "markdown",
"id": "31d0a8e3",
"metadata": {},
"source": [
"####全部出せるが単語がidになっている"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "fae41bc8",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(42, 0.062075567),\n",
" (89, 0.04273717),\n",
" (88, 0.042719133),\n",
" (61, 0.04268211),\n",
" (36, 0.023367709),\n",
" (12, 0.023348304),\n",
" (47, 0.023326987),\n",
" (87, 0.023313979),\n",
" (37, 0.02330752),\n",
" (39, 0.023304764),\n",
" (65, 0.023303064),\n",
" (44, 0.023302296),\n",
" (40, 0.023302207),\n",
" (92, 0.023301514),\n",
" (91, 0.023299163),\n",
" (46, 0.023297438),\n",
" (62, 0.023296762),\n",
" (90, 0.023296038),\n",
" (63, 0.023295458),\n",
" (45, 0.023293993),\n",
" (41, 0.023288673),\n",
" (66, 0.02328635),\n",
" (43, 0.023273813),\n",
" (94, 0.023272764),\n",
" (84, 0.023253977),\n",
" (64, 0.02324806),\n",
" (93, 0.023246517),\n",
" (81, 0.003964733),\n",
" (0, 0.003953826),\n",
" (30, 0.0039488976),\n",
" (28, 0.0039410917),\n",
" (13, 0.00393918),\n",
" (1, 0.0039331694),\n",
" (22, 0.0039322264),\n",
" (15, 0.0039320616),\n",
" (14, 0.003925856),\n",
" (55, 0.003925475),\n",
" (54, 0.003924825),\n",
" (60, 0.003922453),\n",
" (34, 0.0039224233),\n",
" (19, 0.0039215824),\n",
" (56, 0.0039209505),\n",
" (27, 0.0039202226),\n",
" (23, 0.003920087),\n",
" (53, 0.0039194804),\n",
" (21, 0.0039188117),\n",
" (86, 0.0039183106),\n",
" (18, 0.0039180904),\n",
" (95, 0.003917462),\n",
" (29, 0.0039169663),\n",
" (59, 0.0039157867),\n",
" (26, 0.0039155935),\n",
" (85, 0.0039151423),\n",
" (32, 0.0039149076),\n",
" (48, 0.003914859),\n",
" (52, 0.003914661),\n",
" (58, 0.003914032),\n",
" (57, 0.0039139492),\n",
" (49, 0.003913212),\n",
" (11, 0.003913025),\n",
" (25, 0.003912446),\n",
" (80, 0.0039120186),\n",
" (33, 0.0039112447),\n",
" (51, 0.003911237),\n",
" (78, 0.0039110193),\n",
" (17, 0.0039090635),\n",
" (20, 0.0039084596),\n",
" (96, 0.003908097),\n",
" (50, 0.00390788),\n",
" (35, 0.003907824),\n",
" (16, 0.003907593),\n",
" (83, 0.0039054248),\n",
" (82, 0.0039053648),\n",
" (38, 0.0039052258),\n",
" (24, 0.0039046952),\n",
" (75, 0.003904598),\n",
" (31, 0.0039041536),\n",
" (2, 0.0039038737),\n",
" (67, 0.0039036972),\n",
" (73, 0.003903231),\n",
" (3, 0.0039032067),\n",
" (10, 0.0039024367),\n",
" (72, 0.0039023352),\n",
" (79, 0.003902007),\n",
" (74, 0.003901817),\n",
" (77, 0.003901404),\n",
" (9, 0.0039012502),\n",
" (71, 0.0039010614),\n",
" (70, 0.0039006972),\n",
" (8, 0.0039005233),\n",
" (76, 0.0039004104),\n",
" (69, 0.0039002006),\n",
" (5, 0.0039001587),\n",
" (7, 0.003898825),\n",
" (68, 0.0038977202),\n",
" (4, 0.0038974197),\n",
" (6, 0.003896687)]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfword = lda.get_topic_terms(0, topn = 97)\n",
"dfword"
]
},
{
"cell_type": "markdown",
"id": "16c33eba",
"metadata": {},
"source": [
"####いったん横持ちのデータフレームに"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "14f2ced2",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>0</th>\n",
" <th>1</th>\n",
" <th>2</th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <th>7</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" <th>...</th>\n",
" <th>87</th>\n",
" <th>88</th>\n",
" <th>89</th>\n",
" <th>90</th>\n",
" <th>91</th>\n",
" <th>92</th>\n",
" <th>93</th>\n",
" <th>94</th>\n",
" <th>95</th>\n",
" <th>96</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.003954</td>\n",
" <td>0.003933</td>\n",
" <td>0.003904</td>\n",
" <td>0.003903</td>\n",
" <td>0.003897</td>\n",
" <td>0.003900</td>\n",
" <td>0.003897</td>\n",
" <td>0.003899</td>\n",
" <td>0.003901</td>\n",
" <td>0.003901</td>\n",
" <td>...</td>\n",
" <td>0.023314</td>\n",
" <td>0.042719</td>\n",
" <td>0.042737</td>\n",
" <td>0.023296</td>\n",
" <td>0.023299</td>\n",
" <td>0.023302</td>\n",
" <td>0.023247</td>\n",
" <td>0.023273</td>\n",
" <td>0.003917</td>\n",
" <td>0.003908</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.005080</td>\n",
" <td>0.029629</td>\n",
" <td>0.004962</td>\n",
" <td>0.004969</td>\n",
" <td>0.004966</td>\n",
" <td>0.004962</td>\n",
" <td>0.004960</td>\n",
" <td>0.004960</td>\n",
" <td>0.004964</td>\n",
" <td>0.004964</td>\n",
" <td>...</td>\n",
" <td>0.004961</td>\n",
" <td>0.004973</td>\n",
" <td>0.004967</td>\n",
" <td>0.004965</td>\n",
" <td>0.004968</td>\n",
" <td>0.004965</td>\n",
" <td>0.004976</td>\n",
" <td>0.004974</td>\n",
" <td>0.004987</td>\n",
" <td>0.004972</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.033905</td>\n",
" <td>0.005715</td>\n",
" <td>0.005665</td>\n",
" <td>0.005678</td>\n",
" <td>0.005664</td>\n",
" <td>0.005660</td>\n",
" <td>0.005666</td>\n",
" <td>0.005663</td>\n",
" <td>0.005668</td>\n",
" <td>0.005664</td>\n",
" <td>...</td>\n",
" <td>0.005660</td>\n",
" <td>0.005673</td>\n",
" <td>0.005678</td>\n",
" <td>0.005664</td>\n",
" <td>0.005664</td>\n",
" <td>0.005656</td>\n",
" <td>0.005690</td>\n",
" <td>0.005676</td>\n",
" <td>0.005674</td>\n",
" <td>0.005672</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.048365</td>\n",
" <td>0.026399</td>\n",
" <td>0.004419</td>\n",
" <td>0.004423</td>\n",
" <td>0.004422</td>\n",
" <td>0.004418</td>\n",
" <td>0.004417</td>\n",
" <td>0.004417</td>\n",
" <td>0.004420</td>\n",
" <td>0.004417</td>\n",
" <td>...</td>\n",
" <td>0.004416</td>\n",
" <td>0.004437</td>\n",
" <td>0.004425</td>\n",
" <td>0.004423</td>\n",
" <td>0.004421</td>\n",
" <td>0.004423</td>\n",
" <td>0.004436</td>\n",
" <td>0.004423</td>\n",
" <td>0.026339</td>\n",
" <td>0.026374</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.041122</td>\n",
" <td>0.022482</td>\n",
" <td>0.022429</td>\n",
" <td>0.022413</td>\n",
" <td>0.022431</td>\n",
" <td>0.022437</td>\n",
" <td>0.022438</td>\n",
" <td>0.022438</td>\n",
" <td>0.022428</td>\n",
" <td>0.022432</td>\n",
" <td>...</td>\n",
" <td>0.003752</td>\n",
" <td>0.003765</td>\n",
" <td>0.003759</td>\n",
" <td>0.003758</td>\n",
" <td>0.003754</td>\n",
" <td>0.003758</td>\n",
" <td>0.003769</td>\n",
" <td>0.003766</td>\n",
" <td>0.003766</td>\n",
" <td>0.003758</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>5 rows × 97 columns</p>\n",
"</div>"
],
"text/plain": [
" 0 1 2 3 4 5 6 \\\n",
"0 0.003954 0.003933 0.003904 0.003903 0.003897 0.003900 0.003897 \n",
"1 0.005080 0.029629 0.004962 0.004969 0.004966 0.004962 0.004960 \n",
"2 0.033905 0.005715 0.005665 0.005678 0.005664 0.005660 0.005666 \n",
"3 0.048365 0.026399 0.004419 0.004423 0.004422 0.004418 0.004417 \n",
"4 0.041122 0.022482 0.022429 0.022413 0.022431 0.022437 0.022438 \n",
"\n",
" 7 8 9 ... 87 88 89 90 \\\n",
"0 0.003899 0.003901 0.003901 ... 0.023314 0.042719 0.042737 0.023296 \n",
"1 0.004960 0.004964 0.004964 ... 0.004961 0.004973 0.004967 0.004965 \n",
"2 0.005663 0.005668 0.005664 ... 0.005660 0.005673 0.005678 0.005664 \n",
"3 0.004417 0.004420 0.004417 ... 0.004416 0.004437 0.004425 0.004423 \n",
"4 0.022438 0.022428 0.022432 ... 0.003752 0.003765 0.003759 0.003758 \n",
"\n",
" 91 92 93 94 95 96 \n",
"0 0.023299 0.023302 0.023247 0.023273 0.003917 0.003908 \n",
"1 0.004968 0.004965 0.004976 0.004974 0.004987 0.004972 \n",
"2 0.005664 0.005656 0.005690 0.005676 0.005674 0.005672 \n",
"3 0.004421 0.004423 0.004436 0.004423 0.026339 0.026374 \n",
"4 0.003754 0.003758 0.003769 0.003766 0.003766 0.003758 \n",
"\n",
"[5 rows x 97 columns]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"topic_df = pd.DataFrame(index=range(5))\n",
"for c in range(97):\n",
" topic_df[c] = 0.0\n",
"\n",
"for i in range(5):\n",
" topics = lda.get_topic_terms(i, topn = 97)\n",
" for t, p in topics:\n",
" topic_df.loc[i][t] = p\n",
"topic_df"
]
},
{
"cell_type": "markdown",
"id": "ad0f624b",
"metadata": {},
"source": [
"####縦横変換"
]
},
{
"cell_type": "code",
"execution_count": 17,
"id": "8146e945",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>wordid</th>\n",
" <th>topic0</th>\n",
" <th>topic1</th>\n",
" <th>topic2</th>\n",
" <th>topic3</th>\n",
" <th>topic4</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>0.003954</td>\n",
" <td>0.005080</td>\n",
" <td>0.033905</td>\n",
" <td>0.048365</td>\n",
" <td>0.041122</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>0.003933</td>\n",
" <td>0.029629</td>\n",
" <td>0.005715</td>\n",
" <td>0.026399</td>\n",
" <td>0.022482</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>0.003904</td>\n",
" <td>0.004962</td>\n",
" <td>0.005665</td>\n",
" <td>0.004419</td>\n",
" <td>0.022429</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>0.003903</td>\n",
" <td>0.004969</td>\n",
" <td>0.005678</td>\n",
" <td>0.004423</td>\n",
" <td>0.022413</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>0.003897</td>\n",
" <td>0.004966</td>\n",
" <td>0.005664</td>\n",
" <td>0.004422</td>\n",
" <td>0.022431</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92</th>\n",
" <td>92</td>\n",
" <td>0.023302</td>\n",
" <td>0.004965</td>\n",
" <td>0.005656</td>\n",
" <td>0.004423</td>\n",
" <td>0.003758</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93</th>\n",
" <td>93</td>\n",
" <td>0.023247</td>\n",
" <td>0.004976</td>\n",
" <td>0.005690</td>\n",
" <td>0.004436</td>\n",
" <td>0.003769</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>94</td>\n",
" <td>0.023273</td>\n",
" <td>0.004974</td>\n",
" <td>0.005676</td>\n",
" <td>0.004423</td>\n",
" <td>0.003766</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>95</td>\n",
" <td>0.003917</td>\n",
" <td>0.004987</td>\n",
" <td>0.005674</td>\n",
" <td>0.026339</td>\n",
" <td>0.003766</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>96</td>\n",
" <td>0.003908</td>\n",
" <td>0.004972</td>\n",
" <td>0.005672</td>\n",
" <td>0.026374</td>\n",
" <td>0.003758</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>97 rows × 6 columns</p>\n",
"</div>"
],
"text/plain": [
" wordid topic0 topic1 topic2 topic3 topic4\n",
"0 0 0.003954 0.005080 0.033905 0.048365 0.041122\n",
"1 1 0.003933 0.029629 0.005715 0.026399 0.022482\n",
"2 2 0.003904 0.004962 0.005665 0.004419 0.022429\n",
"3 3 0.003903 0.004969 0.005678 0.004423 0.022413\n",
"4 4 0.003897 0.004966 0.005664 0.004422 0.022431\n",
".. ... ... ... ... ... ...\n",
"92 92 0.023302 0.004965 0.005656 0.004423 0.003758\n",
"93 93 0.023247 0.004976 0.005690 0.004436 0.003769\n",
"94 94 0.023273 0.004974 0.005676 0.004423 0.003766\n",
"95 95 0.003917 0.004987 0.005674 0.026339 0.003766\n",
"96 96 0.003908 0.004972 0.005672 0.026374 0.003758\n",
"\n",
"[97 rows x 6 columns]"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfbb = topic_df.T\n",
"dfbb.reset_index(inplace=True)\n",
"dfbb = dfbb.rename(columns={'index': 'wordid',0: 'topic0',1: 'topic1',2: 'topic2',3: 'topic3',4: 'topic4'})\n",
"dfbb"
]
},
{
"cell_type": "markdown",
"id": "157e1527",
"metadata": {},
"source": [
"####結合"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "8d045326",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>word</th>\n",
" <th>wordid</th>\n",
" <th>topic0</th>\n",
" <th>topic1</th>\n",
" <th>topic2</th>\n",
" <th>topic3</th>\n",
" <th>topic4</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>ない</td>\n",
" <td>0</td>\n",
" <td>0.003954</td>\n",
" <td>0.005080</td>\n",
" <td>0.033905</td>\n",
" <td>0.048365</td>\n",
" <td>0.041122</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>テレビ</td>\n",
" <td>1</td>\n",
" <td>0.003933</td>\n",
" <td>0.029629</td>\n",
" <td>0.005715</td>\n",
" <td>0.026399</td>\n",
" <td>0.022482</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>人見知り</td>\n",
" <td>2</td>\n",
" <td>0.003904</td>\n",
" <td>0.004962</td>\n",
" <td>0.005665</td>\n",
" <td>0.004419</td>\n",
" <td>0.022429</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>以外</td>\n",
" <td>3</td>\n",
" <td>0.003903</td>\n",
" <td>0.004969</td>\n",
" <td>0.005678</td>\n",
" <td>0.004423</td>\n",
" <td>0.022413</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>務める</td>\n",
" <td>4</td>\n",
" <td>0.003897</td>\n",
" <td>0.004966</td>\n",
" <td>0.005664</td>\n",
" <td>0.004422</td>\n",
" <td>0.022431</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>92</th>\n",
" <td>築地</td>\n",
" <td>92</td>\n",
" <td>0.023302</td>\n",
" <td>0.004965</td>\n",
" <td>0.005656</td>\n",
" <td>0.004423</td>\n",
" <td>0.003758</td>\n",
" </tr>\n",
" <tr>\n",
" <th>93</th>\n",
" <td>ぼる塾</td>\n",
" <td>93</td>\n",
" <td>0.023247</td>\n",
" <td>0.004976</td>\n",
" <td>0.005690</td>\n",
" <td>0.004436</td>\n",
" <td>0.003769</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>掛け合い</td>\n",
" <td>94</td>\n",
" <td>0.023273</td>\n",
" <td>0.004974</td>\n",
" <td>0.005676</td>\n",
" <td>0.004423</td>\n",
" <td>0.003766</td>\n",
" </tr>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>怖い</td>\n",
" <td>95</td>\n",
" <td>0.003917</td>\n",
" <td>0.004987</td>\n",
" <td>0.005674</td>\n",
" <td>0.026339</td>\n",
" <td>0.003766</td>\n",
" </tr>\n",
" <tr>\n",
" <th>96</th>\n",
" <td>芸風</td>\n",
" <td>96</td>\n",
" <td>0.003908</td>\n",
" <td>0.004972</td>\n",
" <td>0.005672</td>\n",
" <td>0.026374</td>\n",
" <td>0.003758</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>97 rows × 7 columns</p>\n",
"</div>"
],
"text/plain": [
" word wordid topic0 topic1 topic2 topic3 topic4\n",
"0 ない 0 0.003954 0.005080 0.033905 0.048365 0.041122\n",
"1 テレビ 1 0.003933 0.029629 0.005715 0.026399 0.022482\n",
"2 人見知り 2 0.003904 0.004962 0.005665 0.004419 0.022429\n",
"3 以外 3 0.003903 0.004969 0.005678 0.004423 0.022413\n",
"4 務める 4 0.003897 0.004966 0.005664 0.004422 0.022431\n",
".. ... ... ... ... ... ... ...\n",
"92 築地 92 0.023302 0.004965 0.005656 0.004423 0.003758\n",
"93 ぼる塾 93 0.023247 0.004976 0.005690 0.004436 0.003769\n",
"94 掛け合い 94 0.023273 0.004974 0.005676 0.004423 0.003766\n",
"95 怖い 95 0.003917 0.004987 0.005674 0.026339 0.003766\n",
"96 芸風 96 0.003908 0.004972 0.005672 0.026374 0.003758\n",
"\n",
"[97 rows x 7 columns]"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfcc = pd.merge(dfaa, dfbb, on='wordid', how='inner') \n",
"dfcc "
]
},
{
"cell_type": "markdown",
"id": "694c0f26",
"metadata": {},
"source": [
"####各文書のトピックへの所属確率"
]
},
{
"cell_type": "code",
"execution_count": 19,
"id": "76c69871",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[(0, 0.016669735),\n",
" (1, 0.016722998),\n",
" (2, 0.016697152),\n",
" (3, 0.016766189),\n",
" (4, 0.9331439)]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"lda[corpus[0]]"
]
},
{
"cell_type": "markdown",
"id": "a28356ee",
"metadata": {},
"source": [
"####データフレームに格納"
]
},
{
"cell_type": "code",
"execution_count": 20,
"id": "25110f43",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>topic0</th>\n",
" <th>topic1</th>\n",
" <th>topic2</th>\n",
" <th>topic3</th>\n",
" <th>topic4</th>\n",
" <th>docid</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0.016670</td>\n",
" <td>0.016723</td>\n",
" <td>0.016697</td>\n",
" <td>0.016766</td>\n",
" <td>0.933144</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0.028663</td>\n",
" <td>0.028575</td>\n",
" <td>0.885046</td>\n",
" <td>0.029141</td>\n",
" <td>0.028574</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0.033338</td>\n",
" <td>0.866644</td>\n",
" <td>0.033341</td>\n",
" <td>0.033339</td>\n",
" <td>0.033338</td>\n",
" <td>3</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0.033340</td>\n",
" <td>0.033342</td>\n",
" <td>0.033343</td>\n",
" <td>0.033559</td>\n",
" <td>0.866416</td>\n",
" <td>4</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0.040007</td>\n",
" <td>0.040009</td>\n",
" <td>0.040010</td>\n",
" <td>0.839463</td>\n",
" <td>0.040510</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>0.028576</td>\n",
" <td>0.885185</td>\n",
" <td>0.028578</td>\n",
" <td>0.028989</td>\n",
" <td>0.028672</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>0.033639</td>\n",
" <td>0.866008</td>\n",
" <td>0.033341</td>\n",
" <td>0.033339</td>\n",
" <td>0.033672</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>0.919914</td>\n",
" <td>0.020004</td>\n",
" <td>0.020005</td>\n",
" <td>0.020073</td>\n",
" <td>0.020003</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>0.033510</td>\n",
" <td>0.033341</td>\n",
" <td>0.033342</td>\n",
" <td>0.866469</td>\n",
" <td>0.033339</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>0.040006</td>\n",
" <td>0.040007</td>\n",
" <td>0.839976</td>\n",
" <td>0.040006</td>\n",
" <td>0.040005</td>\n",
" <td>10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>0.033338</td>\n",
" <td>0.866500</td>\n",
" <td>0.033341</td>\n",
" <td>0.033339</td>\n",
" <td>0.033482</td>\n",
" <td>11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>0.910653</td>\n",
" <td>0.022420</td>\n",
" <td>0.022228</td>\n",
" <td>0.022227</td>\n",
" <td>0.022473</td>\n",
" <td>12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>0.018280</td>\n",
" <td>0.018311</td>\n",
" <td>0.018186</td>\n",
" <td>0.018185</td>\n",
" <td>0.927037</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>0.025003</td>\n",
" <td>0.025112</td>\n",
" <td>0.025645</td>\n",
" <td>0.899072</td>\n",
" <td>0.025168</td>\n",
" <td>14</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>0.022226</td>\n",
" <td>0.022227</td>\n",
" <td>0.022276</td>\n",
" <td>0.022405</td>\n",
" <td>0.910865</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>0.028663</td>\n",
" <td>0.028576</td>\n",
" <td>0.884917</td>\n",
" <td>0.029071</td>\n",
" <td>0.028773</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>0.033499</td>\n",
" <td>0.033427</td>\n",
" <td>0.033687</td>\n",
" <td>0.865895</td>\n",
" <td>0.033493</td>\n",
" <td>17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>0.927136</td>\n",
" <td>0.018185</td>\n",
" <td>0.018257</td>\n",
" <td>0.018239</td>\n",
" <td>0.018184</td>\n",
" <td>18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>0.866368</td>\n",
" <td>0.033340</td>\n",
" <td>0.033615</td>\n",
" <td>0.033339</td>\n",
" <td>0.033338</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>0.033337</td>\n",
" <td>0.033426</td>\n",
" <td>0.033548</td>\n",
" <td>0.866351</td>\n",
" <td>0.033337</td>\n",
" <td>20</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" topic0 topic1 topic2 topic3 topic4 docid\n",
"0 0.016670 0.016723 0.016697 0.016766 0.933144 1\n",
"1 0.028663 0.028575 0.885046 0.029141 0.028574 2\n",
"2 0.033338 0.866644 0.033341 0.033339 0.033338 3\n",
"3 0.033340 0.033342 0.033343 0.033559 0.866416 4\n",
"4 0.040007 0.040009 0.040010 0.839463 0.040510 5\n",
"5 0.028576 0.885185 0.028578 0.028989 0.028672 6\n",
"6 0.033639 0.866008 0.033341 0.033339 0.033672 7\n",
"7 0.919914 0.020004 0.020005 0.020073 0.020003 8\n",
"8 0.033510 0.033341 0.033342 0.866469 0.033339 9\n",
"9 0.040006 0.040007 0.839976 0.040006 0.040005 10\n",
"10 0.033338 0.866500 0.033341 0.033339 0.033482 11\n",
"11 0.910653 0.022420 0.022228 0.022227 0.022473 12\n",
"12 0.018280 0.018311 0.018186 0.018185 0.927037 13\n",
"13 0.025003 0.025112 0.025645 0.899072 0.025168 14\n",
"14 0.022226 0.022227 0.022276 0.022405 0.910865 15\n",
"15 0.028663 0.028576 0.884917 0.029071 0.028773 16\n",
"16 0.033499 0.033427 0.033687 0.865895 0.033493 17\n",
"17 0.927136 0.018185 0.018257 0.018239 0.018184 18\n",
"18 0.866368 0.033340 0.033615 0.033339 0.033338 19\n",
"19 0.033337 0.033426 0.033548 0.866351 0.033337 20"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"docdf = pd.DataFrame(index=range(len(corpus)))\n",
"for c in range(5):\n",
" docdf[c] = 0.0\n",
"\n",
"for i in range(len(corpus)):\n",
" topics = lda[corpus[i]]\n",
" for t, p in topics:\n",
" docdf.loc[i][t] = p\n",
"\n",
"serial_num = pd.RangeIndex(start=1, stop=len(docdf.index) + 1, step=1)\n",
"docdf['docid'] = serial_num\n",
"docdf = docdf.rename(columns={'index': 'docid',0: 'topic0',1: 'topic1',2: 'topic2',3: 'topic3',4: 'topic4'})\n",
"docdf"
]
},
{
"cell_type": "markdown",
"id": "66535f4b",
"metadata": {},
"source": [
"####列の整理とdocidとの結合"
]
},
{
"cell_type": "code",
"execution_count": 21,
"id": "89611f70",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>docid</th>\n",
" <th>word</th>\n",
" <th>topic0</th>\n",
" <th>topic1</th>\n",
" <th>topic2</th>\n",
" <th>topic3</th>\n",
" <th>topic4</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1</td>\n",
" <td>若槻千夏 幾つ テレビ 番組 司会 務める 本番 以外 人見知り 話す ない</td>\n",
" <td>0.016670</td>\n",
" <td>0.016723</td>\n",
" <td>0.016697</td>\n",
" <td>0.016766</td>\n",
" <td>0.933144</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2</td>\n",
" <td>漫才 ツッコミ 担当 たりないふたり ボケ 担当</td>\n",
" <td>0.028663</td>\n",
" <td>0.028575</td>\n",
" <td>0.885046</td>\n",
" <td>0.029141</td>\n",
" <td>0.028574</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>3</td>\n",
" <td>ナナメ 夕暮れ 他 本 出す</td>\n",
" <td>0.033338</td>\n",
" <td>0.866644</td>\n",
" <td>0.033341</td>\n",
" <td>0.033339</td>\n",
" <td>0.033338</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>4</td>\n",
" <td>深夜 一人 バスケットボール スリーポイント 練習</td>\n",
" <td>0.033340</td>\n",
" <td>0.033342</td>\n",
" <td>0.033343</td>\n",
" <td>0.033559</td>\n",
" <td>0.866416</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>5</td>\n",
" <td>プライベート バスケットボール 足 怪我</td>\n",
" <td>0.040007</td>\n",
" <td>0.040009</td>\n",
" <td>0.040010</td>\n",
" <td>0.839463</td>\n",
" <td>0.040510</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>6</td>\n",
" <td>星野源 日本 テレビ 界 希望 思う</td>\n",
" <td>0.028576</td>\n",
" <td>0.885185</td>\n",
" <td>0.028578</td>\n",
" <td>0.028989</td>\n",
" <td>0.028672</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>7</td>\n",
" <td>藤井青銅 ピンク ベスト じゃない方 しゃべれる</td>\n",
" <td>0.033639</td>\n",
" <td>0.866008</td>\n",
" <td>0.033341</td>\n",
" <td>0.033339</td>\n",
" <td>0.033672</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>8</td>\n",
" <td>mc waka 日本武道館 横浜アリーナ 人 歌 ラップ 茶々 入れる</td>\n",
" <td>0.919914</td>\n",
" <td>0.020004</td>\n",
" <td>0.020005</td>\n",
" <td>0.020073</td>\n",
" <td>0.020003</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>9</td>\n",
" <td>茶々 名前 チワワ 犬 飼う</td>\n",
" <td>0.033510</td>\n",
" <td>0.033341</td>\n",
" <td>0.033342</td>\n",
" <td>0.866469</td>\n",
" <td>0.033339</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>10</td>\n",
" <td>結婚 直前 浮気 ばれる</td>\n",
" <td>0.040006</td>\n",
" <td>0.040007</td>\n",
" <td>0.839976</td>\n",
" <td>0.040006</td>\n",
" <td>0.040005</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>11</td>\n",
" <td>六本木 社長 モンクレール ダウン もらう</td>\n",
" <td>0.033338</td>\n",
" <td>0.866500</td>\n",
" <td>0.033341</td>\n",
" <td>0.033339</td>\n",
" <td>0.033482</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>12</td>\n",
" <td>ピンク ベスト 着る 胸 張る トゥース 大声 叫ぶ</td>\n",
" <td>0.910653</td>\n",
" <td>0.022420</td>\n",
" <td>0.022228</td>\n",
" <td>0.022227</td>\n",
" <td>0.022473</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>13</td>\n",
" <td>ピンク セーター 着る 後輩 芸人 すいません ピンク 着 もらう 挨拶</td>\n",
" <td>0.018280</td>\n",
" <td>0.018311</td>\n",
" <td>0.018186</td>\n",
" <td>0.018185</td>\n",
" <td>0.927037</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>14</td>\n",
" <td>漫才 ボケ 担当 ラジオ テレビ ボケ ない</td>\n",
" <td>0.025003</td>\n",
" <td>0.025112</td>\n",
" <td>0.025645</td>\n",
" <td>0.899072</td>\n",
" <td>0.025168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>15</td>\n",
" <td>普段 靴下 履く ない 足 裏 象 よう</td>\n",
" <td>0.022226</td>\n",
" <td>0.022227</td>\n",
" <td>0.022276</td>\n",
" <td>0.022405</td>\n",
" <td>0.910865</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>16</td>\n",
" <td>バカリズム 存在 面白い ウケる スベる ない</td>\n",
" <td>0.028663</td>\n",
" <td>0.028576</td>\n",
" <td>0.884917</td>\n",
" <td>0.029071</td>\n",
" <td>0.028773</td>\n",
" </tr>\n",
" <tr>\n",
" <th>16</th>\n",
" <td>17</td>\n",
" <td>山里亮太 ツッコミ 敵わ ない 思う</td>\n",
" <td>0.033499</td>\n",
" <td>0.033427</td>\n",
" <td>0.033687</td>\n",
" <td>0.865895</td>\n",
" <td>0.033493</td>\n",
" </tr>\n",
" <tr>\n",
" <th>17</th>\n",
" <td>18</td>\n",
" <td>入船 出身 築地 出身 嘘 地元 人 お前 入船 ツッコミ</td>\n",
" <td>0.927136</td>\n",
" <td>0.018185</td>\n",
" <td>0.018257</td>\n",
" <td>0.018239</td>\n",
" <td>0.018184</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>19</td>\n",
" <td>ぼる塾 人 トゥース 掛け合い 面白い</td>\n",
" <td>0.866368</td>\n",
" <td>0.033340</td>\n",
" <td>0.033615</td>\n",
" <td>0.033339</td>\n",
" <td>0.033338</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>20</td>\n",
" <td>スベる 芸風 スベる 怖い 思う</td>\n",
" <td>0.033337</td>\n",
" <td>0.033426</td>\n",
" <td>0.033548</td>\n",
" <td>0.866351</td>\n",
" <td>0.033337</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" docid word topic0 topic1 \\\n",
"0 1 若槻千夏 幾つ テレビ 番組 司会 務める 本番 以外 人見知り 話す ない 0.016670 0.016723 \n",
"1 2 漫才 ツッコミ 担当 たりないふたり ボケ 担当 0.028663 0.028575 \n",
"2 3 ナナメ 夕暮れ 他 本 出す 0.033338 0.866644 \n",
"3 4 深夜 一人 バスケットボール スリーポイント 練習 0.033340 0.033342 \n",
"4 5 プライベート バスケットボール 足 怪我 0.040007 0.040009 \n",
"5 6 星野源 日本 テレビ 界 希望 思う 0.028576 0.885185 \n",
"6 7 藤井青銅 ピンク ベスト じゃない方 しゃべれる 0.033639 0.866008 \n",
"7 8 mc waka 日本武道館 横浜アリーナ 人 歌 ラップ 茶々 入れる 0.919914 0.020004 \n",
"8 9 茶々 名前 チワワ 犬 飼う 0.033510 0.033341 \n",
"9 10 結婚 直前 浮気 ばれる 0.040006 0.040007 \n",
"10 11 六本木 社長 モンクレール ダウン もらう 0.033338 0.866500 \n",
"11 12 ピンク ベスト 着る 胸 張る トゥース 大声 叫ぶ 0.910653 0.022420 \n",
"12 13 ピンク セーター 着る 後輩 芸人 すいません ピンク 着 もらう 挨拶 0.018280 0.018311 \n",
"13 14 漫才 ボケ 担当 ラジオ テレビ ボケ ない 0.025003 0.025112 \n",
"14 15 普段 靴下 履く ない 足 裏 象 よう 0.022226 0.022227 \n",
"15 16 バカリズム 存在 面白い ウケる スベる ない 0.028663 0.028576 \n",
"16 17 山里亮太 ツッコミ 敵わ ない 思う 0.033499 0.033427 \n",
"17 18 入船 出身 築地 出身 嘘 地元 人 お前 入船 ツッコミ 0.927136 0.018185 \n",
"18 19 ぼる塾 人 トゥース 掛け合い 面白い 0.866368 0.033340 \n",
"19 20 スベる 芸風 スベる 怖い 思う 0.033337 0.033426 \n",
"\n",
" topic2 topic3 topic4 \n",
"0 0.016697 0.016766 0.933144 \n",
"1 0.885046 0.029141 0.028574 \n",
"2 0.033341 0.033339 0.033338 \n",
"3 0.033343 0.033559 0.866416 \n",
"4 0.040010 0.839463 0.040510 \n",
"5 0.028578 0.028989 0.028672 \n",
"6 0.033341 0.033339 0.033672 \n",
"7 0.020005 0.020073 0.020003 \n",
"8 0.033342 0.866469 0.033339 \n",
"9 0.839976 0.040006 0.040005 \n",
"10 0.033341 0.033339 0.033482 \n",
"11 0.022228 0.022227 0.022473 \n",
"12 0.018186 0.018185 0.927037 \n",
"13 0.025645 0.899072 0.025168 \n",
"14 0.022276 0.022405 0.910865 \n",
"15 0.884917 0.029071 0.028773 \n",
"16 0.033687 0.865895 0.033493 \n",
"17 0.018257 0.018239 0.018184 \n",
"18 0.033615 0.033339 0.033338 \n",
"19 0.033548 0.866351 0.033337 "
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"dfdd = pd.merge(train, docdf, on='docid', how='inner') \n",
"dfdd "
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3.9.12 ('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.9.12"
},
"vscode": {
"interpreter": {
"hash": "993fce270c76d4fb12648ce20a7d5ad42f28ae13fdfb18f25956a147218f0a70"
}
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment