# 単語クラスタリングによって文書情報を整理する手法の改良

符 家俊*1 村田 真樹*1,2 馬 青*3
*1 鳥取大学大学院 工学研究科情報エレクトロニクス専攻
*2 鳥取大学工学部付属クロス情報科学研究センター
$* 3$ 龍谷大学 先端理工学部 数理・情報科学課程
${ }^{* 1,2}\{$ m20j4046h@edu. ,murata@ \}tottori-u.ac.jp
*3 qma@math.ryukoku.ac.jp

## 1 はじめに

近年,インターネットの発展と伴い, ネット上の情報が急速的に増えている.これらの情報を上手く利用するために, ネット上の文書の情報を利用して, 重要な情報を表に整理する研究が考えられている.このような研究では重要な情報を表に整理して, 重要な情報を見やすいようにする. 作文の際に書き漏らしの部分を検出することもできる. 赤野ら [1] の研究では, 文書を単語単位で整理する. まずは人手でクラスタ数を 1000 と決定して, Wikipedia でのデータと Word2vec を用いて， クラスタリングする. そして,このクラスタリングの結果を用いて, 電子文書に出現するクラスタの単語を該当する行と列の箇所に埋めて, 表を作る. 岡崎ら [2] の研究では, 情報を文単位で抽出して,これらの情報をクラスタリングする際, 自動的に最適なクラスタ数や列の重要度を決めて, 情報を表に整理する。

岡崎ら [2] の研究では文で情報を整理するので, 単語のように細かく情報を整理することはできない。一方, 赤野ら [1] の研究では重要な列が見つからない場合がある. 本研究ではこの欠点を改善するため, 単語レベルで情報を抽出しつつ, 岡崎らの研究を使って, 表の埋まり具合と情報の密集度を用いて, クラスタリングの際の最適なクラスタ数を推定して, 重要な列を自動的に選択する. 本研究での主張点は以下の 3 点である.

## 新規性

赤野ら [1] の研究は人手でクラスタ数 1000 で設定して, 人手で重要な列を選択する. 本研究では自動でクラスタ数を決定して, 重要度の順に列を自動的に並べ替える.

## 有用性

赤野ら [1] の研究では人手で重要な列を選択する必要がある. 本研究では手作業がなくても, 自動的に重要な列を選択することができる.

## 性能

本研究で整理した表の性能を $\mathrm{F}$ 值で評価すると, 平均值は 0.82 である. 異なるデータでの実験であるが $\mathrm{F}$ 值で赤野ら [1] の研究を評価すると, その平均値は 0.75 である.

## 2 徒来手法

赤野ら [1] の研究では文書に含まれる情報を単語ごとに分割し, 種類ごとに分類し, 表に整理する手法を提案した. 表に整理する手順を以下に示す.

## 2.1 従来手法の手順

手順 1 抽出したい事柄を決定する. Wikipedia から, 抽出したい事柄を含む文書を抽出する.

手順 2 Wikipedia の全データを用いて, Word2vec で単語をクラスタリングする. 各クラスタにはクラスタ番号をふる。

手順 3 クラスタリング結果に基づく単語のクラスタを表の列とし, 文章を表の行とし, 文書に出現するクラスタの単語を該当する行と列の箇所に埋める。

手順 4 表の各列にある単語の頻度を求める.この頻度を用いて, 頻度の大きい列を左の方にするようにソートする. 頻度の少ないクラスタ番号の列を削除する.

手順 5 表のソート結果を基に人手で表の列を選択する.

## 2.2 従来手法の問題点

従来手法では Wikipedia の全データを使って, 人手でクラスタ数を 1000 に設定してクラスタリングし,このクラスタリングの結果と整理したい文書を比較し表を作るので, 列の数が多すぎて単語の頻度でソートしても重要な列を選択するのが難しいという問題がある.

## 3 提案手法

従来手法では Wikipedia 全データを使って, 人手でクラスタ数を 1000 で設定してクラスタリングする. 本研究では岡崎ら [2] の研究を使って, 表の埋まり具合と情報の密集度のバランスを最適にする方法でクラス久数を推定し,クラスタリングする. 赤野ら [1] の研究では人手で重要な列を選択する. 本研究では岡崎ら [2] が提案した情報を自動的に重要度で整理する方法を使って, 文書中の重要な単語レベルの情報を自動的に選択し, 表に整理する. 提案手法の手順を以下に示す.

## 3.1 提案手法の手順

複数文書に含まれる単語の情報を表に整理する手順を以下に示す。

手順 1 文書に含まれる単語を MeCabで分割して, 品詞が名詞かつ連続している単語を一つの単語として扱う.このような単語は連続単語と呼ぶ. 名詞ではない単語を削除する。

手順 2 各文について, 文中の単語のベクトルを求め, 連続単語のベクトルはこの連続単語に含まれる単一の単語のベクトルの和をこの連続単語のベクトルとする.

手順 3 単語ベクトルを基に単語を Ward 法による階層クラスタリングでクラスタリングする.

手順 4 階層クラスタリングによって得られた各クラスタ数でのクラスタリング結果を基に, 表を作る. 表の埋まり具合と情報の密集度を使って, 最適なクラスタ数を推定し, 最適な表を選択する。

手順 5 手順 4 で採用されたクラスタ数でのクラスタリングの結果を, 行を文書, 列をクラスタとする, 表に整理する。

手順 6 表の各列について, 重要度を計算して, 重要度で並べ替える。

## 3.2 文から単語への分割方法

手順 1 における複数文書を単語単位に分割する方法を説明する．文書を MeCabで単語ごとに分割する。例えば「本体の前後に 400 万画素 CMOS センサー内蔵カメラをそれぞれ搭載し、全方位撮影できるモデル。」のような文が存在する．この文を MeCabで分割すると「本体の前後に 400 万画素 CMOS センサー内蔵カメラをそれぞれ搭載し、全方位撮影できるモデル。」になるが, 分割しすぎる場合が
ある. 例えば「400」と「万」である.この問題を解決するため連続した名詞を一つの名詞として扱う.この方法で文を処理すると「本体の前後に 400 万画素 CMOS センサー内蔵カメラをそれぞれ搭載し、全方位撮影できるモデル。」となる. その後で, 名詞ではない単語を全部削除する. 以下に手順を示す. 図 1 に例を示す.

手順 1 文を MeCabを用いて分割する。

手順 2 連続の名詞を一つの名詞として扱う.

手順 3 名詞ではない単語を削除する.

処理前

本体の前後に 400 万画素 CMOS センサー内蔵カメラをそれぞれ搭載し、全方位撮影できるモデル。

分割して名詞のみ抽出

本体前後 400 万画素 CMOS センサー内藏カメラそれぞれ搭載方位撮影モデル

図 1 処理結果の例

## 3.3 単語ベクトルの計算

連続の名詞を一つの名詞として扱うので, 連続の名詞ではない単語はそのまま Fasttext[3] を用いて, 単語ベクトルを計算する. 連続名詞の場合では以下の手順で単語ベクトルを計算する。

手順 1 連続の単語を $\mathrm{MeCab}$ で分割する。

手順 2 分割した単語を Fasttext[3] で単語ベクトルを求める. 連続単語に含まれる単語のベクトルの和をその連続単語のベクトルとして扱う。

## 3.4 単語ベクトルモデル

単語ベクトルを求めるとき使ったモデルは Fasttext[3] によって Wikipedia 全データを学習させたものである. Fasttext[3] は隠扎層と出力層からなる 2 層のニューラルネットワークで, CBOW や Skip-gram を用いて, 単語をベクトル化する。

## 3.5Ward 法による階層クラスタリング

階層クラスタリング [4] は最初一つのデータを一つのクラスタとして扱う.そして距離が最も近いクラスタを統合する.この統合をそのまま設定したクラスタ数になるまで繰り返す. Ward 法は二つのクラスタ間の距離を推定する方法の一つである.

## 3.6 クラスタリング結果の score の計算方法

から求める. 情報の密集度 (density $k$ )を式 (2) からそれぞれ求める.クラスタ数 $\mathrm{k}$ での score $_{k}$ はこの 2 つの値を掛け算して求めた值である.これらの数式に現れる変数について説明する. $\mathrm{C}_{k}$ はクラスタ数 $\mathrm{k} て ゙ の$ 表で列の総数である. $\mathrm{C}_{k i}$ はクラスタ数 $\mathrm{k}$ での表に $\mathrm{i}$ 番目の列に含まれる単語の数である. $\mathrm{W}_{k i j}$ はクラスタ数 $\mathrm{k}$ での表の $\mathrm{i}$ 番目の列で $\mathrm{j}$ 番目の単語のベクトルである. 単語の間の類似度は $\cos$ 類似度で求める。

$
\begin{gathered}
\text { cover }_{k}=\frac{\text { クラスタ数 } k \text { での表の空でないセルの数 }}{\text { クラスタ数 } k \text { での表のセルの総数 }} \\
\text { density }_{k}=\min \left(\cos \left(W_{k i j}, W_{k i h}\right)\right) \\
i=1,2, \ldots \ldots, C_{k} \quad j, h=1, \ldots \ldots, C_{k i}
\end{gathered}
$

ここで, cover と density のスケールが異なるため,クラスタ数 $\mathrm{k} て ゙ の$ 表の score を計算するとき影響を与えないように,この二つの値の正規化した値を掛け算したものをクラスタ数 $\mathrm{k}$ での表の score として扱う. そして score が最も大きいクラスタリング結果を選択する.数式にある $\max (\mathrm{x}), \min (\mathrm{x})$ は $\mathrm{x}$ の最大值, 最小値を意味する.

$
\begin{aligned}
& \text { norm }\left(\text { cover }_{k}\right)=\frac{\text { cover }_{k}-\min (\text { Cover })}{\max (\text { Cover })-\min (\text { Cover })}
\end{aligned}
$

$
\begin{aligned}
& \operatorname{score}_{k}=\operatorname{norm}\left(\text { cover }_{k}\right) * \operatorname{norm}\left(\text { density }_{k}\right)
\end{aligned}
$

## 3.7 列に重要度をつける方法

列の重要度の計算は score の計算と似ている. 列の密集度と列のカバー率を掛け算した值をその列の重要度として扱う. 列の密集度は実際その列にある単語間の最小類似度である.この値が高いほど, 列にある単語の関連性が高い.この列の関連性と列のカバー率を掛け算した結果の値が大きいと,この列の重要度も高いと思われる.数式は以下で示す.

$
\begin{gathered}
\text { cover }_{i}=\frac{\text { 表の } i \text { 番目の列の空でないセルの数 }}{\text { 表の } i \text { 番目の列のセルの総数 }} \\
\text { density }_{i}=\min \left(\cos \left(W_{i j}, W_{i h}\right)\right) \\
i=1,2, \ldots \ldots, C \quad j, h=1, \ldots \ldots, C_{i}
\end{gathered}
$
再現率 $=\frac{\text { 正解の表の列と実験結果の表の列に共通する文の数 }}{\text { 正解の表の列に含まれる文の数 }}$

$
F \text { 值 }=\frac{2 \times \text { 適合率 } \times \text { 再現率 }}{\text { 適合率再現率 }}
$

列の重要度を評価することも重要なことである. 強盗に関する記事で作成した表の最初の 48 列を人手で重要かどうかを評価した結果を表 5 に示す. 列名は列に出現する頻度が最も高い単語とする。

表 3 強盗に関する記事の評価結果の精度

表 4 城に関する評価結果の精度

## 4.4 考察

表 3,4 のように, 強盗に関する記事の中で加害者, 被害者, 犯罪時間, 犯罪場所, 犯罪者の特徵などの重要な情報を抽出できた。これらの情報の重要度が高いと思われる. 城に関する記事の中で城の場所, 城が建てられる時間などを抽出できたが, 有益ではない情報（例えば, 指定, 国など）も多く抽出された. 有益ではない情報が抽出された原因はこれらの単語は何も有用な情報を持っていないが, 出現する頻度か高かったからである. 強盗に関する事件で, 抽出された情報が重要かどうかを人手で評価した結果を表 5 に示す. 人手で重要と判断したものに○を, 重要でないと判断したものに
×をつけている.列の重要度が高いほど, 重要と思われる確率が高いと見える. 表 5 を見ると, 最初の 48 列について 12 列ごとに人が重要と思う列の比率を計算

果を見ると, 重要度が高いほど, 人が重要と思う比率も高いことが確認できるが, 城に関する記事を使って，得られた表の列は少ないので, 8 列ごとに計算すると， 0.375,0.375,0.142,0.285である. 重要順になっていない.

## 5 終わりに

本研究の提案手法では文を単語レベルで分割して,名詞だけ残して, Fasttext を用いて, 単語をべクトル化して, 階層クラスタリングを用いて, 表のカバー率と密集度のバランスによって, 最適なクラスタ数を推定して, 最適なクラスタ数で単語をクラスタリングする.クラスタリングした結果の表の列の重要度を計算して，重要な列を自動的に選択する. 城に関する記事と強盗に関する記事を用いて実験を行った. $\mathrm{F}$ 值で提案手法の性能を計算すると, 平均值は 0.82 であった. 提案手法ではクラスタ数を自動的に推定することができる. さらに, 自動的に重要な列を選択することができる. 実験結果では列の重要度が高いほど, 人が重要と思う比率が高いことを強盗に関する記事を使った実験で確認し, 提案手法の有効性を確認できた. 城に関する記事での実験では抽出された列が少なく, 一部の結果は重要順になっていないという問題がある.これは今後の課題である.

## 参考文献

[1]Hokuto Akano, Masaki Murata, and Qing Ma. Detection of inadequate descriptions in Wikipedia using information extraction based on word clustering. IFSA-SCIS 2017, pp. 1-6, 2017.

[2]岡崎健介, 村田真樹, 馬青. 複数文書からの文レベルの情報の書き漏らしの検出. 言語処理学会第 25 回年次大会,
pp. 359-362, 2019.

[3]Piotr Bojanowski, Edouard Grave, Armand Joulin, and Tomas Mikolov. Enriching word vectors with subword information. In Transactions of the Association for Computational Linguistics, Vol. 5, pp. 135-146, 2017.

[4]Trevor Hastie, Robert Tibshirani, and Jerome Friedman. The Elements of Statistical Learning. Springer, 2009.