2019年5月4日土曜日

KHコーダ(KHcoder)でテキストマイニング  ~ 共起ネットワーク その2 ~


今回、題材としたのはシャーロックホームズの「赤毛連盟」。
有名な話なので読んだことがある人も多いだろう。
もし読んだことが無かったり、若しくは内容をよく覚えていない方は青空文庫等で入手できるので一読して欲しい。その方がテキストマイニングの結果が分かりやすいと思う。
日本語作品は「青空文庫」で、英文は「プロジェクトグーテンベルク」というサイトで入手可能。


早速KHコーダ(KHcoder)を起動して日本語テキストを取り込む。
上部メニューの「プロジェクト」から「新規」、それから当該テキストを選択して新規プロジェクトを作成して、「前処理」→「テキストのチェック」を行う。今回は修正の必要は無いようなので、そのまま「前処理の実行」を行った。
それから抽出語リストを開いて確認し、それから共起ネットワークを作成した。


図1.最初の共起ネットワーク画面

共起ネットワークを確認したところ、今回のテキストでは「シャー」と「ロック」がそれぞれ別々の語で抽出されていた。そのため一度共起ネットワークを終了させ、「前処理」→「複合語の抽出」で行い、それから「前処理」→「語の取捨選択」で「シャーロック」を「強制抽出する語の指定:」で設定した後、「前処理の実行」を行い再度共起ネットワークを描画させた。

以後、オプション画面での設定は下記の通り。
「集計単位」を「段落」
「最少出現数」は10に設定
「品詞による語の取捨選択」では「既定値」
「共起関係(edge)の種類」では「語-語」
「バブルスロット」にチェック
「共起パターンの変化を探る(相関)」にチェック

条件を変えて検討する場合は「実行時にこの画面を閉じない」にチェックを入れる。


まず「Subgraph」を表示させる。


図2.Subgraph - modularity


図3.Subgraph - random walk

サブグラフ検出では「modularity」と「random walk」で、それぞれグループ分け(subgraph)の細部が違っているが、この subgraph により大まかな物語のあらすじは分かってくる。


次に「中心性」を見てみる。
図4.共起ネットワーク「中心性」

中心性で見ると、「質屋」「銀行」「店員」「髪」「コバーグ」※ などの言葉があり、この物語のキーワードとなることがわかる。
※「コバーグ」は質屋がある場所名、すぐ隣に銀行がある。


図5.共起ネットワーク「中心性」(最少スパニング・ツリーだけを描画)

「最少スパニング・ツリーだけを描画」にチェックを入れて描画した。こちらの方がキーワードが分かりやすい感じがする。


最後に「相関」を見てみる。


図6.共起ネットワーク「相関」

こちらも最少スパニング・ツリーだけを描画させた。

図7.共起ネットワーク「相関」(最少スパニング・ツリーだけを描画)

「相関」を表示させることにより、物語の前半では「ウィルソン」「髪」「連盟」などの言葉が、後半では「地下」「銀行」「質屋」などの言葉が多く用いられるようになっていることが分かる。これで物語の展開が大まかに理解できるだろう。
こちらも「最少スパニング・ツリーだけを描画」にした方が分かりやすいようだ。

次に、「関連語検索」で共起ネットワークを表示させてみる。
とりあえず「赤毛」で検索する。
「ツール」→「抽出語」→「関連語検索」で「関連語検索」の画面を表示させて「#直接入力」で「直接入力:」と「and」ボタンの横の入力エリア(デフォルトのカーソルの位置)に「赤毛」と入力し、集計単位は「段落」として「集計」ボタンを押して検索させた。
「フィルタ設定」で品詞は「既定値」、「最少文書数」は10で設定で「OK」を押して、「共起ネット」ボタンを押して描画さる。
「赤毛」を中心とした共起ネットワークが表示された(検索語は二重正方形で囲んで表示)。


図8.「赤毛」で検索した共起ネットワーク

最少スパニング・ツリーだけで描画させた。

図9.「赤毛」で検索した共起ネットワーク(最少スパニング・ツリーだけを描画)

こちらは検索語の選択も含めて、もう少し条件を検討した方が良さそうである。


続いて英文に関しても同様に行う。
抽出語の確認をしたところ、英文では「sherlock」は問題無く認識されていたので、強制抽出は行わなかった(stop words は設定済み)。
「品詞による語の取捨選択」では「すべて」を選択。後は日本語と同じ条件設定で行った。

図10.共起ネットワーク「Subgraph modularity」表示


図11.共起ネットワーク「中心性」表示


図12.共起ネットワーク「中心性」表示(最少スパニング・ツリーだけを描画)


図13.共起ネットワーク「相関」表示


図14.共起ネットワーク「相関」表示(最少スパニング・ツリーだけを描画)


同じく気になるキーワードがあれば、日本語と同様に「関連語検索」で共起ネットワークを表示させれば良い。
例として「red-headed」で検索して、共起ネットワークを最少スパニング・ツリーだけで描画させた(Subgraph - modularity表示)。



今回は共起ネットワークだけを用いてテキストマイニングを行ったが、以上のように題材とした小説「シャーロックホームズの冒険・赤毛連盟」の大まかなストーリーやキーワードは英語・日本語共に理解できた。KHコーダには共起ネットワーク以外にも様々なコマンドがあるので興味がある方はマニュアル等を参考にしていただきたい。さらに詳細なテキストマイニングを行えるはずである。

2019年5月2日木曜日

KHコーダ(KHcoder)でテキストマイニング  ~ 共起ネットワーク その1 ~


KHコーダにはいくつかの分析コマンドがあるが、今回は主に共起ネットワークを使用することにした。共起とは、ある単語と別の限られた単語が頻繁に出現することである。
このコマンドを用いることにより出現パターンの似通った語を線(edge)で結んだネットワークを描画することが出来る。そこからテーマないしはトピックを読み取れる。
よって小説でこの分析コマンドを使うと、物語のあらすじや登場人物の関係図などが読み取れるはずである。


共起ネットワークを表示させるには大きく分けて二つある。

その1.「ツール」→「抽出語」→「共起ネットワーク」で起動する方法
これで起動すると共起ネットワークの「オプション」画面(設定画面)になる。ここで各種の設定を行い「OK」で共起ネットワークが描画される。
それぞれの設定に関しては基本的はデフォルトの設定で大きな問題は無いが下記項目に関しては検討が必要となる場合もあると思う。

<集計単位と抽出語の選択>
「集計単位」
KHコーダでは分析対象テキスト中で「語」が出現する場所と「語」が出現する回数を計算して分析する。「語」は抽出語のことで分析の最小単位となり、「場所」は「文」または「段落」のことである。よって集計単位を「段落」に設定するのか「文」に設定するのかで結果が大きく異なることがある。「段落」「文」それぞれを試して良い方を選択する必要があるが、「段落」→「文」の順で評価することが推奨されている。

「最小出現数」
出現語(抽出語)の最少出現数を設定する。大きくすれば対象語が少なくなるし、小さく設定すれば多くなる。試して最も適当な数値を検討する必要がある。

「品詞による語の取捨選択」
前述のように「既定値」の設定では、良く用いられるが特徴的な意味をあまり持たない語を省いてある(日本語の場合のみ)。
こちらもどの品詞を表示させるのが良いか試してみると良いだろう。


<共起ネットワークの設定>
「共起関係(edge)の種類」
ここでは語と語、または語と外部変数の共起関係の表示の設定ができる。今回は外部変数は用いていないので「語-語」で設定する。

「バブルプロット」
この項目ににチェックを入れると、語の出現数に対応して円のサイズが変化する。つまり大きい円ほど多く出現している語になる。

「最小スパニング・ツリーだけを描画」
この項目にチェックを入れるとシンプルなネットワークを描くことができる。ネットワークが複雑になったりして見づらいときに使うオプションである。

「共起パターンの変化を探る(相関)」
このオプションを利用することにより相関関係を可視化して物語の進行にともなう変化を読み取ることが出来る。
具体的には、相関を計算する対象を「出現位置」にしてネットワークを描画させると、データの前方(物語の前半)で多く共起している語のペアは青色の線(edge)で結ばれ、データ後方(物語の後半)で多く共起している語のペアは赤色の線(edge)で結ばれる。





<共起ネットワーク描画画面での操作>
中心性とサブグラフ検出
「比較的強くお互いに結びついてる部分」のことを、KHコーダ(KH Coder)では「サブグラフ」と表記される。つまり同じグループといった意味であろう。
共起ネットワークを描画した場合、下部に「カラー:」と表示されているボタンが表示される。これを押すことによりプルダウンメニューで、語(node)の色分け方法を幾つか選択できる。
最初は「中心性」による色分けであり、黄色よりも青色の方が,中心性が高いことを示す。
次は、比較的強くお互いに結びついてる部分を自動的に検出してグループ分けを行い、その結果を色分けによって示す「サブグラフ検出」である。
「modularity」と「random walks」の方法を選ぶことができるが、見やすい方を選ぶと良いだろう。
ちなみに色のついていない語(白色)は、他の語とサブグラフを形成していない単独の語である。また同じサブグラフに含まれる語は実線で結ばれるのに対して互いに異なるサブグラフに含まれる語は破線で結ばれる。
「共起パターンの変化を探る(相関)」にチェックを入れると前述の方法に加えて「相関」が追加される。


その2.「ツール」→「抽出語」→「関連語検索」で検索を行い、下部メニューから「共起ネットワーク」をクリックし起動する方法。

この場合は検索した語に関しての共起ネットワークが表示され、検索の条件として用いた語は二重の正方形で囲んで表示される。
しかし検索語が表示されない場合があったので原因を調べたところ、どうやら対象語が多い場合は二重正方形で囲んで表示されるはずの検索語が表示されない場合があるようだ。
その時は「フィルタ設定」で「最少文書数」の数を増すなどの操作を行う。
この「フィルタ設定」の画面も全体が表示されないにもかかわらず、スクロールバーも表示されないので、もし「OK」ボタンが画面に表示されていない場合はウィンドウを下部に伸ばしてみることも必要のようである。
検索語が表示される以外は、その1の場合とほぼ同じである。

2019年5月1日水曜日

KHコーダ(KHcoder)でテキストマイニング  ~ 抽出語の作成まで ~


本稿の作成に当たってはKHコーダーのマニュアルを参考にさせていただいた。KHコーダーの開発者の樋口耕一先生に謝辞を表したいと思う。また著作権の関係から詳細な内容は割愛した(無断転載に当たる可能性があるので)。興味がある方はKHコーダーのマニュアルを一読されることをお勧めする。
ちなみに、現時点でのKHコーダーのバージョンは3.Alpha.16である。


KHコーダ(KHcoder)は英語にも対応しているらしい。他の外国語も対応しているようだが英語以外は試作段階のようだ。
今回は英語と日本語の両方で同じ題材を使用するので、その違いが分かるかも。

「単純なテキストファイルを使用して分析の一歩目を踏み出す」という目的のため、今回は小説を使ってKHコーダの一般的な使い方で分析を行う。


通常テキストマイニングは外部変数などを使うことが多い。
外部変数というのは、例えばアンケート等で質問に対する回答に付随する属性等で性別であったり年齢、住んでいる場所などの情報である。
今回は外部変数を付与する必要は無いのでテキストのみで行う。

余談だが、KHコーダではテキスト形式だけでなくエクセルファイルやCSV形式のファイルも扱えるらしい。

KHコーダでテキストマイニングを始める前に英文では確認することがある。ダウンロードしたテキストファイル中には、体裁を整えるため右端を改行で体裁を整えてある場合があり、この場合はこの改行を削除する必要がある。
その理由は、KHコーダでは対象の文章を「文」単位と「段落」単位で分析を行うことによる。「文」の場合は句読点で、「段落」の場合は改行で判断する。そのため段落の終わり以外で改行がなされていると「段落」が不正確になり正確な分析ができない可能性がある。そのため不必要な改行を削除する。

その方法はコチラで説明しているので参考にして欲しい。


1.プロジェクトの作成
KHコーダではまず「プロジェクト」の作成から始める。初めての場合は新規作成になる。それからファイルを開く。この時、日本語か英語の選択ができる。

日本語の場合、上部メニューの「前処理」から「分析対象ファイルのチェック」を選んで実行すると分析対象テキストをそのま読込できるのかどうかををチェックしてくれる。
英語の場合は「分析対象ファイルのチェック」はアクティブになっていないので使用できないようだ。まあ英文は26文字しかなく日本語のように多数の文字数は無いので大きな問題無いだろう。


2.前処理の実行
次に「前処理の実行」をクリックする。この「前処理の実行」は対象の文章を分析するため必ず行う必要がある。

3.抽出語の確認
完了したら、上部メニューの「ツール」→「抽出語」→「抽出語リスト」で抽出語の確認ができる。
「抽出語リスト」のみでも抽出語の確認ができるが、パソコンにエクセルが入っている場合には「抽出語リスト(Excel出力)」も行った方が良い。「抽出語リスト」だけでは出現回数が多い順で表示されるため「フィルタ設定」でどの品詞を表示させるか判断が難しいが、「抽出語リスト(Excel出力)」で表示させると抽出語リストが品詞毎に全てエクセルで表示されるので、その判断がしやすくなる。

日本語の場合、フィルタの「既定値」の設定では一般的に用いられるが特徴的な意味を持たない語を省いてある(「する」「ある」「ない」などの語)。
これは日本語だけの設定であり、英語でも「既定値」ボタンは表示されるが押してもフィルタ設定に変化は無い。
以下説明する強制抽出した語は日本語・英語共に「タグ(TAG)」に分類される。

また抽出語リストを確認すると、目的とする語が抽出されていない場合がある。
その時はまず「前処理」→「複合語の抽出」で複合語を抽出する。
それから「前処理」→「語の取捨選択」で表示される画面で、対象の語を「強制抽出」する。「複合語の抽出」でも抽出されなかった場合は「語の取捨選択」で直接入力する。


ここまでは日本語と英語ともにほぼ同じように処理は行える。
しかし英語では別の注意が必要になる。
それは「stop words」の処理で、stop words処理とは英語において頻繁に使用されるが特徴的な意味をあまり持たない語(be動詞など)を表示させない処理のことである。

設定方法は上部のメニューから「プロジェクト」→「設定」をクリックすれば設定画面が表示されるので「stop words」の「設定」ボタンをクリックして設定する。今回はtutorial_en フォルダに同梱されているstop words のリストサンプル(stopwords_sample_en.txt)をそのまま用いた。


図1.KHcoderの設定画面.

結局のところ、日本語の場合はフィルタ設定の「既定値」で、英語の場合は stop words で同じような処理を行うイメージだろう。

そして各種の設定変更を行った場合、必ず再度「前処理の実行」を行うこと。そうしないと変更内容は分析結果に反映されない。

2019年4月29日月曜日

KHコーダ(KHcoder)でテキストマイニング 準備編

KHコーダ(KHcoder)で英文のテキストマイニングをやってみようと思った。

題材は「プロジェクトグーテンベルク」という日本の「青空文庫」みたいなサイトからテキスト形式でダウンロード。

エディタで中身を確認。
するとココで大きな問題を発見する。

体裁を整えるために文章の右側で改行してあるのだ。

↓こんな感じ
His manner was not effusive. It seldom was; but he was glad, I
think, to see me. With hardly a word spoken, but with a kindly
eye, he waved me to an armchair, threw across his case of cigars,
and indicated a spirit case and a gasogene in the corner. Then he
stood before the fire and looked me over in his singular
introspective fashion.


今回使用するテキストマイニングツール「KHコーダ(KHcoder)」では、文章の終わりを句読点で段落の終わりを改行で判断する。
この場合、一つの段落にもかかわらずKHコーダでは6つの段落と判断してしまう。これでは正確な分析はできない。
更には、通常は語と語の間を半角スペースで区切ってあるが文末に改行がある場合はこの半角スペースが無い。
よって修正しようと思うと、半角スペースを挿入して改行を削除(または改行を削除して半角スペースを挿入でも問題無し)という作業が必要となる。
短い文章であれば問題は無いけれど、文章が長いと手間がかかるしタイプミスや操作ミスの可能性もある。

そこで良い方法はないだろうかと調べるとワープロソフトの「ワード」で改行を削除できることが分かった。

以下その手順(Word 2013 の場合)

準備として改行文字が表示されていない場合は表示させる。
1.[ファイル] をクリックして [オプション]
2.[表示] をクリックし、[段落記号] をチェックして [OK]

改行を削除する方法
1.[ホーム] タブをクリックし、編集グループにある [置換] をクリック
2.[オプション] をクリックし、[あいまい検索] のチェックを外す。次に[特殊文字] をクリックして [段落記号] をクリック
3.「検索する文字列」に改行を表す文字列 ^p が入力される。「置換後の文字列」には何も入力しないと削除される。
ここで「検索する文字列」に段落記号 ^p を、「置換後の文字列」に半角スペースを入れて実行すると改行文字は削除され、代わりに半角スペースが挿入される。


以上の作業で改行は削除できた。しかし今度は段落が分からなくなってしまう。そこで良く文章を見ると半角スペースが二つ繋がっている箇所がある(もし半角スペースが表示されていない場合は、段落記号を表示したようにオプションの表示でスペースを表示させる)。
元の段落の場所は、改行が二つ繋がっていた場所で改行を半角スペースに置換させたので半角スペースが繋がっている状態となっているのだ。
よって、同じように今度は半角スペース2つを「検索する文字列」に入れ、「置換後の文字列」に段落記号 ^p を入れる。段落記号を2つ入れても問題無い。一つだと段落同士が隣接するし、二つ入れると段落と段落の間が一段改行される形になる。どちらがいいかはお好みで。

場合によっては改行の前に半角スペースが入ってしまうことがある。この場合も「検索する文字列」に半角スペースと段落記号 ^p を、「置換後の文字列」に段落記号 ^p を入れて置換すると半角スペースは削除される。

どうやらワードだけでなくエクセルでも改行文字の削除はできるようなのだが、今回はワードで目的とする操作ができたのでエクセルの方は調べなかった。興味がある方はご自分で調べてみて下さい。

これで題材の準備はOK。
テキストマイニングの場合、文や段落が重要な意味を持つため文章の区切りを正確にすることが大事である。間違った情報からは間違った結果しか導かない。ご注意を!!