JLit トピックビューア 操作マニュアル

Step 8「トピックモデル(LDA / MALLET)」で作るトピックビューアの使い方。 画面の各欄の見出しにある ? を押すと,このマニュアルの該当する節が開く。

1この道具で何をするか

MALLET で学習したトピックモデル(LDA)の結果を,読むための画面である。 トピックは「語の確率分布」なので,上位キーワードの一覧を眺めるだけでは,それが主題なのか, 1つの作品の登場人物名の束なのか,機能語の寄せ集めなのかが分からない。この画面では

1枚の HTML で,サーバもネットワークも要らない。ブラウザで開くだけで使える。

2マニュアルを横に並べて使う

画面右上の 操作マニュアル ↗ と,各欄の ? は, このマニュアルを別のウィンドウで開く。何度押しても同じウィンドウが使われ,該当する節まで送られる。

  1. ビューアで 操作マニュアル ↗ を押す(別のウィンドウが開く)
  2. macOS では,ウィンドウ左上の緑のボタンにポインタを載せ,出てくるメニューから 画面の左半分に並べる項目を選ぶ(macOS の版によって表記が違う)。もう一方のウィンドウを右半分に選ぶ
  3. 大きなモニターや2台目のモニターがあれば,マニュアルのウィンドウをそちらへ移す
ヒントビューアは幅 900px 未満になると左の欄が上に回る。 画面を2分割するときはビューア側を広めにするとよい。

3作り方と開き方

ノートブックから(ふつうはこちら)

  1. Step 8 で MALLET を実行し(本番と,語を選び直したもの), 「トピックビューアを作る」のセルを実行する
  2. macOS なら次のセルで既定のブラウザに開く。あるいは my_work/results/topic_viewer.html をブラウザで開く

このマニュアル(topic_viewer_manual.html)は,ビューアと同じフォルダに一緒に書き出される。 ビューアのファイルをほかの場所へ移すときは,マニュアルも一緒に移すこと。

ターミナルから

python3 scripts/19_topic_viewer.py \
    --model 名詞・動詞・形容詞=my_work/results/mallet_nva \
    --model 内容語すべて=my_work/results/mallet \
    --out my_work/results/topic_viewer.html
引数働き
--model 名前=ディレクトリMALLET の出力ディレクトリ。何度でも指定でき,画面で切り替えられる
--lexicon語の品詞と頻度帯の表(18_pos_select.py が書く data/tokens/lexicon.tsv)
--top各トピックについて保持する語の数(既定 400)。多いほど λ を下げたときの並びが正確になる
--min-countモデル内の頻度がこれ未満の語はビューアに入れない(既定 3)
--d2vStep 7 の doc2vec の出力(work_vectors.csv のあるディレクトリ)。作品のネットワークに使う
--labelsビューアで書き出したラベル(topic_labels.json)。省くと,--out と同じフォルダにあれば読む
--rel-mfw関連の強いトピックの Delta 系の指標に使う語の数(既定 500)
⚠ビューアは作った時点の結果を写した1枚である。MALLET を実行し直したら, ビューアも作り直すこと。

4画面の構成

① 見出し:モデルの切り替え・操作マニュアル ② 左の欄 品詞 頻度帯(5つのつまみ) 並べ方(relevance λ) 表示する語数 語で探す 並べ替え ③ トピックのカード T00 … 割合・残存・上位キーワード(品詞で色分け) 押すと ④ に詳細が出る ④ トピックの詳細 上位キーワードの棒・時代別の割合 このトピックが多い作品・担う作家 ⑤ 関連の強いトピック (上部のタブでネットワーク・ラベルづけに切り替える)
画面の構成(幅の広いとき)。幅が 900px 未満では ② が上に回る。

5モデルを切り替える

見出しの モデル で,ビューアに入れたモデルを切り替える。 Step 8 のノートブックからは,「語を選び直したもの」と「本番(内容語すべて)」の2つが入る。 左の欄の下に,いま見ているモデルのトピック数・作品数・トークン数と,MALLET の出力ディレクトリが出る。

切り替えると,絞り込みの設定はそのままで,選んでいたトピックの詳細は閉じる (トピックの番号はモデルごとに別物なので,T05 と T05 は対応しない)。

6品詞で絞る

チェックを外した品詞の語を,カードと詳細の上位キーワードから隠す。語の色は品詞を表す。 右の数字は,そのモデルのトークンのうちその品詞が占める割合である。

分類中身(UniDic の品詞)
普通名詞・固有名詞・数詞名詞-普通名詞・名詞-固有名詞・名詞-数詞
動詞(自立)/動詞(非自立)動詞-一般/動詞-非自立可能(いる・する・なる など)
形容詞(自立)/形容詞(非自立)形容詞-一般/形容詞-非自立可能(ない・よい など)
形状詞・副詞・代名詞それぞれの品詞
その他上のどれにも当たらないもの
⚠品詞は UniDic の解析結果であって原文の事実ではない。 人名が普通名詞と解析されることがある。固有名詞を外しても人名が残るときは, 次の「1作品への集中度」「1作家への集中度」を下げる。

7頻度帯で絞る

5つのつまみで,上位キーワードを頻度や散らばりの性質で絞る。つまみの右に今の値が出る。

つまみ意味使いどころ
全体の頻度(最小)コーパス全体での頻度がこれ未満の語を隠す(対数の目盛り) 一回きりの語や誤解析を除く
出現作品の割合(最大)その語が現れる作品の割合がこれを超える語を隠す どの作品にも出る語(言う・思う・顔)を除き,トピックに特有の語を見る
1作品への集中度(最大)語の頻度のうち1作品が占める割合がこれを超える語を隠す その作品にしか出ない語(登場人物名など)を除く
1作家への集中度(最大)語の頻度のうち1作家が占める割合がこれを超える語を隠す 同じ作家の複数作品に出る人物名(「素子」など)は,作品ではなく作家に集中する
散らばり dp_in(最大)Gries の DP を,その語の最多区分(相対頻度が最も高い時代区分)の中で測ったもの。1 に近いほど少数の作品に固まる(bursty) 時代への偏りは不利に扱わずに,特定の作品に固まる語だけを除く

頻度・割合・集中度・dp_in は 18_pos_select.py が書く語の表(lexicon)から来る。 語にポインタを載せると,UniDic の語彙素(外来語は原綴つき)と品詞が出る。

8並べ方(relevance λ)

上位キーワードの並べ方を relevance(Sievert & Shirley 2014)で決める。

relevance = λ log p(w|t) + (1−λ) log(p(w|t) / p(w))

表示する語数(5〜50)で,カードに出す語の数を変える。

語を入れると,その語を上位(表示する語数以内)に持つトピックだけが濃く残り,ほかは薄くなる。 一致した語には色の帯が付く。見出しの行に,当たったトピックの数が出る。

語彙素(例:汽車)でも,外来語の片仮名だけ(例:テーブル)でも当たる。 絞り込みや λ で上位から外れた語は当たらない。

10トピックのカードと並べ替え

1枚のカードが1つのトピックである。

表示意味
T00, T01, …トピックの番号(MALLET の番号)
割合(例 3.2%)と細い棒コーパス全体でそのトピックが占める割合(チャンクの平均)
残存(例 残存 64%)ビューアが持っている上位キーワードの確率のうち,いまの絞り込みの後に残った割合。 低いトピックは,隠した語でできている
上位キーワード絞り込みの後に残った語を λ の順に並べたもの。色は品詞

左の欄の 並べ替え で,トピック番号・割合の大きい順・ 絞り込み後に残る確率の大きい順(残存の順)に並べ替える。カードを押すと,下に詳細が出る。

11トピックの詳細

2つの割合を区別する

列意味向き
作品内の割合その作品の中でこのトピックが占める割合P(トピック|作品)
トピックに占める割合このトピックの重みのうち,その作品(作家)から来る割合P(作品|トピック)

「A 高校の生徒の半分が野球部」と「野球部員の9割が A 高校」が両立するのと同じで, 向きが逆なので値は一致しない。どちらも語の絞り込みでは変わらない。

⚠トピックの重みの半分より多くが1作品(または1作家)から来ていると, 詳細の上に警告が出る。そのトピックは主題ではなく,作品指標や作家指標である可能性が高い。

詳細のいちばん下に,選んだトピックと関連の強いトピックが並ぶ。 行を押すと,そのトピックに移る。各行の上位キーワードは,いまの絞り込みと λ で並べたもの。

指標何を測るか近いのは
Jensen–Shannon divergence(既定)2つの語分布 p(w|t) の隔たり(底 2,0〜1)。LDAvis のトピック間距離と同じ考え方(Lin 1991; Sievert & Shirley 2014)小さいほど
語分布のコサイン類似度p(w|t) を並べたベクトルの向き。頻度の大きい語に引きずられやすい大きいほど
Burrows's Delta(zスコア)最頻語(既定 500 語)の p(w|t) をトピックをまたいで zスコアにし,差の絶対値を平均したもの小さいほど
Cosine Delta同じ zスコアのベクトルの 1 − コサイン類似度(Smith & Aldridge 2011)小さいほど
チャンク上の相関(CLR 変換後)チャンクごとのトピックの割合を CLR(centred log-ratio; Aitchison 1986)で変換し,チャンクをまたいで取った Pearson の相関係数大きいほど

上の4つは語分布の近さ(同じ語でできているか),相関は文書の中での共起 (同じチャンクに一緒に現れるか)を測る。語がほとんど重ならなくても, 同じ場面に続けて現れる2つのトピックは相関が高くなる。件数 で並べる数を変える。

⚠トピックの割合は和が 1 の比率データなので,相関の平均は −1/(K−1)(K はトピック数)になる。画面にそのモデルでの値が出るので,その値を基準に読む。 また,同じ作品のチャンクが多いので,相関は作品・作家の偏りも拾う。

13ネットワーク(トピック・作品)

画面上部の トピック一覧/トピックのネットワーク/作品のネットワーク/ 作品とトピックのネットワーク で表示を切り替える。ネットワークでは,近いものどうしをエッジ(辺)(エッジ)で結び, レイアウトで選んだ方法で配置する(既定は力学モデル。つながりの強いものが近くに集まる)。

画面を広く使う(ラップトップなど)

グラフの高さは,画面の残りの高さに合わせて自動で決まる(ウィンドウの大きさを変えると追従する)。 説明・凡例・操作の案内はグラフの上に重ねてあり,場所を取らない。

場所働き
グラフの左上の帯ノードと線の数(作品とトピックのネットワークでは作品・トピック・線の本数,ほかは内側のエッジ(辺)・境界のエッジの本数)。 ⓘ 説明 でグラフの作り方(指標・線の選び方)を,操作 でマウスの操作を小窓に出す。 小窓はもう一度押すか,外を押すか,Esc で閉じる
グラフの右上⊡ 全体を表示:拡大・移動を解き,全体を枠に収める(配置はそのまま)。 ⤢ 全画面:グラフを画面いっぱいに広げる。ノードを押したときの一覧は右に出る。⤡ 元に戻す か Esc で戻る
グラフの左下凡例。凡例 ▾ で畳む・広げる
タブの右端の 設定 ▴設定の欄を畳み,指標・文書ベクトル表現・色・レイアウト・配置し直す・書き出しだけを1行に残す。 設定 ▾ で元に戻す
タブの左端の ◀ サイドパネル左のサイドパネル(品詞・頻度帯など)を畳み,グラフの幅を広げる。 ネットワークの3つのタブでだけ働き,トピック一覧などに移るとサイドパネルは戻る。▶ サイドパネル で広げる

畳んだかどうかは覚えておかない。ビューアを開き直すと,いつもすべて広げた状態から始まる。 図の書き出し(SVG・PDF)には,畳んだかどうかにかかわらず凡例が付く。

操作

操作働き
ノードをドラッグ動かす。放した位置に留まる。Fruchterman–Reingold では周りも動き,作品はダブルクリックで固定を解く。 ほかのレイアウトでは,そのノードだけが動く
ホイール/背景のドラッグ拡大縮小/全体の移動。⊡ 全体を表示 で拡大・移動だけを解き,配置し直す で初めの配置と大きさに戻す
ノードにポインタを載せるトピックは割合と上位キーワード,作品は作家・題・初出年・時代区分・ジャンル・文体が出る
ノードを押すつながる相手を強調し,グラフの下(全画面では右)に近い順の一覧(上位10)を出す。一覧の行を押すとその相手に移る。背景を押すと強調を解く
トピックをダブルクリック一覧の画面に戻り,そのトピックの詳細を開く

見やすくする

操作欄働き
線の色既定は「ノードの分類の色」。両端のノードが同じ分類(同じ作家・同じコミュニティ・同じ時代区分など)なら, 線をその色にする(内側のエッジ(辺))。分類の違うノードを結ぶ線(境界のエッジ)は灰色の破線にする。 「すべて灰色」で色分けを外す。説明の行に内側と境界のエッジの本数と,境界の割合が出る
線の形曲線(初期値)か 直線。曲線は,どの線も同じ側へ弧を描く(線の長さの 18% ふくらむ)。重なった線や,往復するように見える線を見分けやすくなる。SVG・PDF の書き出しにもそのまま写る
ラベルノードの名前(トピックの番号とラベル,作品の題)を出すかどうか。字の色はノードの色と同じ
文字の大きさラベルの字の大きさ(5〜22px)。拡大縮小とは別に変えられる
大きさ:ノード円と四角の大きさの倍率(30〜150%)。配置は変わらない。ノードが込み合うときは下げる
トピックの色作品とトピックのネットワークだけ。灰色(初期値)は作品と区別しやすい。作品の色分けに合わせる では,コミュニティならトピック自身のコミュニティの色,時代区分・作家などなら,線でつながる作品の分類のうち割合の合計が最も大きいものの色にする。線の無いトピックは灰色のまま
大きさ:トピック作品とトピックのネットワークだけ。トピック(四角)の大きさを作品(丸)に対して変える(20〜150%,初期値 60%)
不透過度:ノード円の塗りの不透過度(15〜100%)。下げると,重なったノードや,その下を通る線が透けて見える
不透過度:線エッジの不透過度(10〜100%)。線が込み入っているときに下げると,ノードとラベルが読みやすくなる。 近さによる太さと不透過度の違いはそのまま残る

これらは配置を計算し直さずに変わる。色分けや指標を切り替えても,設定はそのまま残る。

境界のエッジを読む境界のエッジは,作家や時代,コミュニティを橋渡しするつながりである。 色を「作家」にしたとき,破線でほかの作家につながる作品は,その作家の中でも他の作家に近い書き方・語彙をもつ作品かもしれない。 線にポインタを載せると,どの分類どうしを結ぶかが出る。境界の割合は,色分けの変数(作家・時代区分など)で作品がどれだけまとまるかの 目安になる(低いほど,その変数でまとまっている)。ただしエッジの張り方(k・残す割合)で変わるので,比べるときは設定をそろえること。

エッジ(辺)の張り方

レイアウト

操作欄の レイアウト で配置の方法を選ぶ。Fruchterman–Reingold は動きながら落ち着き, ほかは一度に計算して置く(ノードが千を超えると数秒かかる。計算にかかった時間が横に出る)。 乱数シードを固定してあるので,同じ条件なら同じ配置になる。

レイアウトしくみ向くとき
Fruchterman–Reingold(従来の配置)エッジ(辺)をばね,ノードどうしを斥力で結ぶ力学モデル(Fruchterman & Reingold 1991 の考え方)。既定 小さなネットワークをドラッグで動かしながら見る
ForceAtlas2(Gephi 標準の力学モデル。次数の高いノードほど強く反発) 斥力を(次数+1)の積に比例させ,エッジの多いノードの周りに余白を作る(Jacomy et al. 2014)。 LinLog は引力を距離の対数にして,コミュニティどうしをより離す(Noack 2007)。 Gravity は中心へ引く強さ(上げると外れたノードが寄る)。この2つは ForceAtlas2 を選んだときだけ効く(ほかのレイアウトでは薄く表示され,押せない) コミュニティを見る。LinLog と組み合わせるとコミュニティの境目が見やすい
Yifan Hu(粗い配置から多段階で詰める力学モデル) エッジでつながるノードを組にして縮めた粗いグラフを何段か作り,いちばん粗いものから配置して細かく戻す(Hu 2005) 作品数が多いネットワークで,全体の形を安定して見る
MDS(全組の距離を平面上で再現する配置。stress majorisation) エッジではなく,すべての組の距離(指標の値。大きいほど近い指標は 1 − 値)を平面上の距離にできるだけ近づける (Gansner, Koren & North 2005)。作品とトピックのネットワークでは,エッジをたどる最短経路の長さを距離にする 力学モデルの図と見比べる。エッジを張らなかった組の近さも配置に効く
Circular(分類ごとに円周上に並べる) 色 で選んだ分類(時代区分・作家・コミュニティなど)ごとにまとめて円周上に並べ,分類の切れ目を1つあける。 作品とトピックのネットワークでは,外側に作品,内側にトピック(つながる作品の向きの順)を置く 境界のエッジ(灰色の破線)がどの分類をまたぐかを見る

ForceAtlas2 と Yifan Hu は,つながっていない部分(連結成分)を別々に配置し,エッジの平均の長さをそろえてから大きい順に並べる。 Gephi の Scaling に当たる操作は,画面に合わせて自動で拡大縮小するため,下の Expansion/Contraction で代える。

補助の操作働き
Expansion/Contraction形を保って全体を広げる/縮める(1.2 倍/1/1.2 倍)。ノードとラベルの大きさは変わらないので,重なりが減る/増える
Noverlapノードの重なりを解消(重なったノードだけを押し分ける)
Label Adjustラベルの重なりを解消(ラベルとノードを合わせた枠が重ならないように押し分ける)。 ラベルを出していないときは Noverlap と同じ。文字を大きくしたあとは,もう一度押す
Rotate(角度 °)形を保って全体を回す。横の欄に角度(度)を入れて押す。正は時計回り,負は反時計回り (例:90 → −90 で元に戻る)。ラベルは水平のまま。回しても配置の意味は変わらない(向きには意味が無い)

補助の操作は,いまの配置に重ねて効く(レイアウトを選び直すか 配置し直す を押すと元に戻る)。

図を書き出す(SVG・PDF)

操作欄の 書き出し で,いま画面にある図をファイルにする。拡大縮小や移動の状態にかかわらず, ノードとラベルの全体が入るように切り出し,下に凡例を付ける。背景は白(画面が暗い配色でも白地の色にする)。 配置・色分け・線の色・文字の大きさ・不透過度・ノードを押したときの強調は,画面のとおりに写る。

ボタン働き
SVGSVG ファイルを保存する(ファイル名は jlit_network_種類_モデル_レイアウト.svg)。 線と文字はベクトルのままなので,Inkscape や Illustrator で手直しでき,論文やスライドに入れても粗くならない
PDF(印刷)図だけを A4 横 1 ページに収めた印刷の画面を開く。印刷先(送信先)に「PDF に保存」を選ぶ。 これもベクトルのまま保存される

条件を添える(再現のための注記)

条件を添える(初期値でオン)にしておくと,書き出した図の下縁(凡例の下)に,図を作った条件を小さな字で添える。 論文やスライドに図を載せたあとでも,同じ図を作り直せるようにするためである。

行中身
モデルモデル名と置き場所(末尾2階層)・指紋,K,α(合計とトピックごとの幅),β,反復回数,optimize-interval と burn-in, random-seed,threads,ストップリスト(語数と sha1),学習日時,チャンク数・作品数・トークン数・語彙数
グラフ近さの指標(Delta はその語数,doc2vec は次元と置き場所),k,残す割合(2 部グラフでは k と割合の下限),ノード数・エッジ(辺)数(内側・境界)
表示色分けの基準,トピックの色,線の色と形,線の太さの意味,ノードの大きさの基準と倍率,不透過度,ラベルの字の大きさ
配置レイアウトとその設定(LinLog・Gravity・Scaling),補助の操作をした順(例:Label Adjust → Rotate 30°), 手で動かしたノードの数,強調しているノード
作成JLit トピックビューア © Tomoji Tabata (DH UOsaka),ビューアを作った日時と設定(上位キーワードの数・最小頻度),書き出した日時

α と β は MALLET の topic-state.gz の先頭から読む(無ければ topic-keys.txt の α)。 反復回数・seed・ストップリストは MALLET の出力に残らないので,10_mallet.py train が学習のたびに train_params.json に書く。これより前に学習したモデルでは「記録なし」と出る(学習し直すと入る)。

⚠MALLET は threads が 2 以上だと,同じ seed でも結果がわずかに揺れる。完全に同じモデルを作り直すには threads 1 で学習する。 手で動かしたノードがある図は,注記だけからは同じ配置にならない。

欧文 で,書き出す図の英数字(ラベル・凡例・注記の中の数字,英字,欧文の記号)の書体を選ぶ。 初期値は Gill Sans(無ければ Gill Sans MT・Gill Sans Nova)で,和文はいつも和文の書体で書く。 「和文と同じ書体」にすると,英数字も和文の書体で書く。画面の表示は変わらない。

英数字の部分は,文字列を和文と欧文の連なりに分け,欧文の連なりだけに書体を指定している(SVG の <tspan>)。 書体を並べて指定するだけでは,最初の書体しか見ないソフト(Illustrator など)で和文が化けるためである。

文字の書体SVG の文字は,開いたコンピュータにある書体で表示される(和文はヒラギノ角ゴ・游ゴシック・Noto Sans CJK JP の順に探す。 Gill Sans は macOS には標準で入っているが,Windows では Office などに付く Gill Sans MT が要る)。 別のコンピュータで字形が変わって困るときは,PDF で書き出すか,Inkscape などで文字をアウトライン化する。
⚠力学モデル(Fruchterman–Reingold・ForceAtlas2・Yifan Hu)の配置では, 離れたノードどうしの距離には意味が無い(エッジがあるかどうかと,その強さを読む)。MDS の距離は指標の近さを近似するが, 2次元に押し込めた歪みがある。Circular の位置は分類の順に過ぎない。

トピックのネットワーク

指標は 12 関連の強いトピック の5つから選ぶ。円の大きさはトピックの割合。 色は「いちばん割合の高い時代区分」か「コミュニティ」。

作品のネットワーク

文書ベクトル表現中身
doc2vec の作品ベクトル(コサイン類似度)Step 7(09_doc2vec.py)のチャンクの document vector の平均。 Step 7 を実行したあとにビューアを作ると入る
トピック構成の近さ(Jensen–Shannon divergence)いま選んでいるモデルで,作品のチャンクの θ(トピックの割合)を平均したものどうしの隔たり
Burrows's Delta(最頻語の zスコア)Step 4(07_descriptive_stats.py)の最頻語の相対頻度(freq_matrix_mfw.csv)の先頭 最頻語 語(100・200・300。初期値 100)を,作品をまたいで zスコアにし,差の絶対値を平均したもの(Burrows 2002)。小さいほど近い
Cosine Delta(最頻語の zスコア)同じ zスコアのベクトルの 1 − コサイン類似度(Smith & Aldridge 2011)。作家の判定では Burrows's Delta より安定するとされる(Evert et al. 2017)

Delta は Step 4 の出力を --delta で渡すと入る(ノートブックは descriptive/freq_matrix_mfw.csv があれば自動で渡す)。 zスコアは,ビューアに入る作品の集合(Step 4 で数えた作品すべて)の平均と標準偏差(ddof=0)で作る。作品の集合を変えれば値も変わる。

色は時代区分・作家・ジャンル・文体・コミュニティから選ぶ。作家は作品の多い順に8人まで色を付け, 残りは灰色(凡例の「その他」にポインタを載せると名前が出る)。円の大きさは作品のチャンク数。 作品を押すと,近い作品の一覧に加えて,その作品で割合の高いトピックが出る(押すとトピックの詳細へ)。

比べ方同じ作品の集合を3つの表現で結び,色を「作家」や「時代区分」にして見比べる。 最頻語の Delta(主に機能語の使い方=文体),doc2vec(語の並びから学んだ文書の表現), トピック構成(何について書いているか)である。Delta で同じ作家がかたまり,トピック構成では時代でまとまる, といった違いは,それぞれの表現が何を捉えているかの手がかりになる(Step 4 の作家判定と,Step 7 の作家効果と時代効果)。 境界のエッジ(辺)の割合(説明の行)を,同じ k・同じ色分けで表現ごとに比べるとよい。

作品とトピックのネットワーク

作品(丸)とトピック(濃い灰色の四角)を1枚に描き,作品のトピック構成(その作品のチャンクの θ の平均)で結ぶ。 どの作品がどのトピックでできているか,どのトピックがどの作品群に担われているか,複数のトピックにまたがる作品はどれかが見える。

操作欄働き
各作品から割合の高い順に k 個のトピック作品ごとに,作品内の割合の高いトピックへ k 本(1〜5)の線を張る
作品内の割合が m% 以上割合がこれに満たない線は消す(0〜30%,既定 5%)。弱い結び付きを消して骨組みを見るときに上げる
色作品の色分け(時代区分・作家・ジャンル・文体・コミュニティ)。線は作品の色になる。トピックはいつも濃い灰色

線の太さは作品内の割合。四角の大きさはトピックの割合,丸の大きさは作品のチャンク数。トピックの四角は初めは作品に対して 60% の大きさで描く(大きさ:トピック で変えられる)。 トピックを押すと,そのトピックの割合が高い作品の一覧が出る。作品を押すと,その作品で割合の高いトピック(ラベルつき)の一覧が出る。 一覧の行を押すとその作品・トピックに移り,トピックをダブルクリックすると詳細へ移る。

読み方色を「作家」にして,1人の作家の作品だけが集まる四角(トピック)を探すと, そのトピックが主題ではなく作家指標である可能性が見える(詳細の偏りの警告と照らし合わせる)。 逆に,色の違う作品が多く集まる四角は,作家をまたぐ主題の候補である。 コミュニティで色分けすると,作品とトピックが一緒にコミュニティに分かれる(トピックの四角は灰色のまま)。

コミュニティ

いま張られているエッジ(辺)から,互いに密につながるコミュニティを Louvain 法(Blondel et al. 2008)で求めて色分けする。 番号は大きいコミュニティから順に振る。

⚠ネットワークの形とコミュニティは,指標・k・残す割合の選び方で変わる。 1つの設定の図だけで「コミュニティがある」と言ってはいけない。設定を変えても残るコミュニティを探し, その作品やトピックの中身(用例・上位キーワード)で確かめること。配置の上下左右には意味が無く,距離も (MDS を除き)読まない(エッジでつながっているかどうかと,その強さを読む。レイアウト を参照)。

14ラベルづけ

トピックに名前を付けるのは,LDA でいちばん難しい作業の1つである(Lau et al. 2011)。 上位キーワードだけでは,それが主題なのか,1つの作品の登場人物名の束なのか,文体の偏りなのかが分からない。 上部の ラベルづけ のタブで,次の2通りのラベルを扱う。

ラベル作り方表示
仮ラベルビューアが機械的に付ける。λ=0.6 の上位2語に,割合の目立って高い時代区分を[ ]で添える(例:汽車・停車場[明治後期])。 1作品・1作家から重みの半分より多くが来ていれば,時代区分の代わりに[作品][作家]を添える(作家名・作品名は入れない)灰色の字
ラベル診断資料を生成 AI に渡して付けさせたもの,または手で付けたもの色の付いた字

ラベルはカードの見出し・詳細の上・トピックのネットワークのノードに出る。 ラベルには作家名・作品名を入れない。どの作品や作家に偏っているかは,ネットワークの図と詳細を見れば分かる。 名前を入れると,ネットワークの図のラベルが長くなって読みにくくなる。作品指標・作家指標であることは種類(作品指標・作家指標)で示し, 作家名・作品名は根拠に書く。取り込んだラベルに作家名・作品名が入っていると,一覧に ⚠ が出るので手で直す。 ラベルは短いほどよい(図にそのまま載る)。プロンプトでは2〜8字を目安に10字以内を求めており,10字を超えると一覧に ⚠ が出る。

手順

  1. 対象(すべて/ラベルの無いものだけ)と 1回に含めるトピック(5・10・20・すべて)を選ぶ。 無料プランでは長いプロンプトが途中で切れることがあるので,10 前後がよい。← 前・次 → で残りの回に進む
  2. プロンプトをコピー を押し,生成 AI の入力欄に貼り付けて送る。 Claude・ChatGPT・Gemini・Copilot などの無料プランでよい(アカウントの登録は要る。API キーは要らない)
  3. 返ってきた回答の JSON を「2.」の欄に貼り付け,使った AI を選んで 取り込む を押す。 説明文や ```json の囲みが付いていても,JSON の部分を探して読む
  4. 「3.」の一覧で結果を確かめる。ラベル・種類・信頼度は手で直せる(直すと出典に「手で修正」と残る)
  5. ラベルを書き出す で topic_labels.json を保存し,ビューアと同じフォルダ(my_work/results/)に置く。 次にビューアを作るとき自動で読み込まれる

診断資料(プロンプト)の中身

プロンプトには,主題か指標か文体の偏りかを診断してから名前を付けること,根拠は資料の語と作品から挙げること (一般に知られた知識を使ったときはそう明記すること),ラベルに作家名・作品名を入れず内容で表すこと,回答の形(JSON)が書いてある。 本文そのものは送らない(上位キーワードと書誌だけ)。

回答の項目中身
labelラベル(名詞句で2〜8字が目安。10字以内)
type主題/作品指標/作家指標/文体・機能語/混成
confidence高/中/低
evidence・caution根拠(資料の語・作品)と注意点
⚠ラベルは AI の仮説である。もっともらしい名前でも,根拠に挙がった語と作品を 詳細 と KWIC で確かめ,種類(とくに主題か指標か)を自分で判断し直すこと。 同じプロンプトでも,AI の種類や回ごとにラベルは変わる。どの AI で付けたかは出典として記録される。
モデルとの結び付きラベルはモデルの指紋(上位キーワードの一覧から作る12桁の記号)に結び付く。 トピックの番号は学習のたびに変わるので,学習し直したモデルにはラベルが付かない。 別のモデルへの回答を取り込もうとすると,取り込まずに止まる。

15トピック表を書き出す

タブの トピック表 で,トピックと上位キーワードの表(主表)と,トピック診断表を書き出す。 論文に載せることを考えて,キャプションにコーパス名・テクストチャンク数・作品数・トークン数・語彙数・K・α・β・反復回数・optimize-interval・random-seed・上位キーワードの選び方を入れる。 論文の誌面では,主表を本文に,診断表を付録に置くとよい。

主表(トピックと上位キーワード)

列中身
トピック番号(00, 01, …。K が 100 以上なら 3 桁)
平均割合(Mean θ)テクストチャンクにおけるトピックの割合 θ の平均(列 で外せる)
αトピックごとの α(MALLET が最適化した値。topic-state.gz か topic-keys.txt から読む)
ラベルラベルづけ で付けたラベル。無いトピックは仮ラベルを出し,*(日本語では*の注)を付ける
上位キーワード上位の語と,その直後に値を括弧で添える。語数は 上位キーワード(初期値 20,最大 50)で変える
操作欄働き
選び方絞り込みなし(初期値):モデルそのものの p(w|t) の順。
いまの表示設定に従う:画面の λ・品詞・頻度帯の絞り込みで並べた語(カードと同じ語)。このときは λ と絞り込みの条件がキャプションに入る
語の後の値p(w|t)(その語がトピックに割り当てられた数 ÷ トピックの総数)か,頻度(割り当てられた数)
小数の桁p(w|t) の小数の桁数(初期値 3)
並べ方トピック番号の順か,平均割合の大きい順
見出しとキャプション日本語か English。上位キーワードとラベルは日本語のまま
コーパス名キャプションに入る名前(初期値 JLit Corpus 2026)。空にするとキャプションから省く

トピック診断表

トピックごとに,ラベル・α・平均割合・トークン数(そのトピックに割り当てられたトークンの数)・coherence・exclusivity (MALLET の diagnostics.xml から。Mimno et al. 2011)・最多区分(平均割合が最も高い時代区分)・ラベルの種類・信頼度を並べる。 diagnostics.xml が無いモデルでは coherence と exclusivity の列を出さない。

日本語English
平均割合Mean θ
主題/作品指標/作家指標/文体・機能語/混成Theme / Work indicator / Author indicator / Style/function words / Mixed
仮ラベルprovisional
信頼度 高・中・低Confidence high / medium / low

書き出しの形式

形式中身と使い方
LaTeXbooktabs と xltabular を使う表(ページをまたぐと見出しを繰り返し,「(続き)」を付ける)。 \caption[短い題]{キャプション} と \label{tab:topics}(診断表は tab:topic-diagnostics)が入るので, 本文から \ref{tab:topics} で参照できる。値は \wt{…}(小さい字の括弧書き)で書き,プリアンブルで定義し直せば見た目を変えられる。 日本語を含むので LuaLaTeX + luatexja(または upLaTeX)で組む。LaTeX を単独で組める文書にする にすると, プリアンブル付きの 1 ファイルになり,lualatex でそのまま PDF になる。 長い表なので 2 回組む(lualatex を 2 回,または latexmk -lualatex)。 1 回目は列の幅・ページの送り・\ref の番号が確定しないことがある
Markdownパイプの表と,pandoc の書き方のキャプション(: … {#tab:topics})。pandoc で Word や LaTeX に変換できる
CSV1 行目が # で始まるキャプションと出典,2 行目が見出し。上位キーワードは 1 語 1 列(語と値が交互)。UTF-8(BOM 付き)なので Excel でそのまま開ける
JSONキャプション・モデルの情報(学習条件を含む)・トピックごとの値と上位キーワードをまとめたもの。R や Python で読み直すとき用
HTML(Word 用)罫線つきの表。Word や Pages で開くか,下の表示 を HTML にして コピー し,Word に貼り付けると表になる

どの形式にも,ビューアの名前・モデルの指紋・書き出した日時をコメントとして入れる(どのモデルから作った表かを後で確かめるため)。 下の表示 で選んだ形式が下の欄に出るので,コピー して論文のファイルに貼ってもよい。

⚠反復回数・seed などは 10_mallet.py train が書く train_params.json から読む。 それより前に学習したモデルではキャプションに「学習条件の記録なし」と出る。ビューアに入っていない語(モデル内の頻度が --min-count(初期値 3)未満の語)は表にも出ない。

16語を隠すことと,除いて学習し直すこと

ビューアで語を隠すことと,その語を除いて学習し直すことは違う。 隠した語もトピックの形成には寄与している。固有名詞が作ったトピックは, 固有名詞を隠しても「その作品のトピック」のままである。カードの「残存」が低いのはそのためである。

本当に除くには,18_pos_select.py で語を選び直して学習し直し, 両方のモデルをビューアに入れて 切り替えて 比べる。

17困ったとき

症状原因と対処
品詞がすべて「その他」になる/頻度帯のつまみが効かない語の表(lexicon)が無いまま作った。 Step 8 で 18_pos_select.py を実行してから,ビューアを作り直す
カードに「表示できる語が無い」と出る絞り込みが強すぎる。つまみを戻すか,品詞のチェックを入れ直す
操作マニュアルが開かないビューアのファイルだけをほかの場所へ移した。topic_viewer_manual.html を同じフォルダに置くか,ビューアを作り直す
MALLET をやり直したのに結果が変わらないビューアは作った時点の写しである。「トピックビューアを作る」のセルを実行し直し,ブラウザで再読み込みする
「JSON として読めない」と出る回答が途中で切れているか,JSON 以外の文が混ざっている。 1回に含めるトピックを減らして依頼し直すか,回答の { から } までだけを貼り付ける
「別のモデルへの回答である」と出る別のモデル(学習し直す前など)のプロンプトへの回答を貼り付けた。いまのモデルでプロンプトを作り直す
ビューアを作り直したらラベルが消えたtopic_labels.json を書き出して,ビューアと同じフォルダに置いていない。 または MALLET を学習し直した(モデルの指紋が変わった)
作品のネットワークで doc2vec が選べないビューアに doc2vec の結果が入っていない。Step 7 の 09_doc2vec.py を実行してから ビューアを作り直す(ターミナルからは --d2v my_work/results/d2v を付ける)
ネットワークが団子になって読めないエッジ(辺)が多すぎる。k を下げるか,「エッジを残す」の割合を下げる。拡大して読む
開くのが遅い・ファイルが大きい--top を小さくする(既定 400)。λ を下げたときの並びは少し粗くなる

JLit_Corpus_2026 — トピックビューア操作マニュアル。 ビューアは scripts/19_topic_viewer.py が作り,このマニュアルは scripts/topic_viewer_manual.html から ビューアと同じフォルダに書き出される。用語の説明は docs/glossary.md の Step 8 にある。
JLit トピックビューア © Tomoji Tabata (DH UOsaka)