キーフレーズ抽出2020-08
サイボウズラボ機械学習勉強会
一文以上の長い入力文字列から、一文未満の短い文字列をいくつか取り出す
今回の話
単語頻度のアプローチ
入力を単語に刻む
それぞれの単語の出現回数を数える
「回数の多さ」をスコアにする
これをTF(Term Frequency)と呼ぶ
スコアの高いものを表示
問題点
「の」や「を」のような単語の出現頻度が高い
これはどんな文章にも出現頻度が高い
スコアを下げたい
単語xが出現する文書の数を数える
DFの大きい単語は「ありふれた」単語
これをDF(Document Frequency)と呼ぶ そこでDFが大きいほどスコアが小さくなるようにする、これがTF-IDF
(余談)
「単語xが2回以上出現する文書の数」DF2との二軸でプロットするとキーフレーズに関して特徴的な分布が見られる(出現集中)のが面白い logを取ったりするけど、あまり理論的な裏付けはなさそう
「文書」の平均単語数などに影響を受ける
書籍を使うなら1文書は「1冊の本」か「1ページ」か?
グループウェアなら1投稿か?1スレッドか?1スペースか?
本部長会問題
「本部長会」はサイボウズの中ではこれ全体で具体的な繰り返されるイベントを指し示す言葉
しかし単語に刻むと「本」「部長」「会」に分かれてしまう
書籍の意味の「本」や、その他のイベントの「会」と混ざってしまう
「部長」という単語が高頻度だったとしても、そこから「本部長会のことか」と思うことは人間には難しい
人間に見せるなら「複数単語の並び」をキーフレーズとして抽出することが必要
"TextRank: Bringing Order into Texts"
単語に刻んでバラバラに扱うと語順の情報がなくなる、これは良くない
そこで、単語を頂点、隣接関係を辺としてグラフを作成、これに固有値分析を掛けたものを単語のスコアとする
GoogleのPageRankにインスパイアされてるのでTextRankという名前
スコア上位1/3の単語が原文中で連続している場合、連結される
問題点
Q: 高頻度語のスコアが高くなるのでは?
A: Yes、なのでTextRankでは名詞と形容詞だけを使う(名詞句アプローチ)
名詞句アプローチの問題点
候補を絞りすぎ
「エンジニアの知的生産術」も「100人100通りの働き方」もキーフレーズになり得ない
「リーン・スタートアップ」は中黒で刻まれる
Rapid Automatic Keyword Extraction
西尾と同じ問題意識
"axis of evil"(悪の枢軸)をキーフレーズとして取り出したい
仕組み
1: まずストップリストに含まれている単語で分割する
2: 同じ順で出現するキーフレーズがあれば間の単語も含めて結合する
https://gyazo.com/f4483bde4be44d3391ad3d33d60e1105
ストップリストの作り方がキモ
TextRankの名詞句アプローチは、名詞形容詞以外を全部ストップリストに入れたことに相当
論文では2パターン6通り試している
パターンTF:
出現頻度の高い単語はストップ対象という発想
単語のDFが多いものを使う
パターンKA:
キーフレーズの隣に出現し、キーフレーズの中に出現しにくい単語はストップ対象という発想
キーフレーズの中での出現回数が、キーフレーズの隣での出現回数より多いなら、ストップリストから除外
結果
KAが全面的に良い
TFではストップリストの数を増やすと性能が落ちる、KAだと上がる
KAだと「キーフレーズの中にも頻出する単語」がストップリストに入らないから増やせる
https://gyazo.com/ff40bc46f5d69f64b8cd6577a5f215e2
性能評価
速度はTextRankより格段に速い
TextRankは大きな行列の固有値問題を解くのが重たい
精度はF値と、適合率の両方でベスト
適合率とはシステムがキーフレーズだと判定したもののうち、本当にキーフレーズだったものの割合
追試
Wikipediaのリンク記法[[ ]]で囲われてる範囲をキーフレーズだとする
1000ページ/2000ページでストップリストを生成
他の1000ページに対してキーフレーズ抽出
INPUT アンパサンド (&、英語名:ampersand) とは並立助詞「…と…」を意味する記号である。ラテン語の "et" の合字で、Trebuchet MSフォントでは、 <FILE> と表示され "et" の合字であることが容易にわかる。ampersa、すなわち "and per se and"、その意味は"and [the symbol which] by itself [is] and"である。...
EXPECTED ['記号', 'ラテン語', '合字', 'Trebuchet MS', ...
OUTPUT ['symbol which] by itself [is] and', 'アンパサンド (&、英語名', 'and per se and', 'Trebuchet MSフォント', 'and [', 'ampersand', '並立助詞', 'ampersa', 'ラテン語', 'FILE', 'わかる', '記号', '表示', '意味', '合字', 'et', ...
Precision: 0.208, Recall: 0.808, F-measure: 0.331
1000ページのPrecision 0.32+-0.30
だいたい論文と似たような結果が再現された
標準偏差が大きい
論文のアブストが大体似たような長さなのに対し、Wikipediaのランダムなページは長さがマチマチなのが影響しているかも
細かい話
論文では上位1/3を取っている
普通は増やすとPrecisionが下がる
今回の実験では逆に上がった
スコアの高いキーフレーズが、正解でない確率が高い
比較
TextRank
ストップリスト: 名詞形容詞以外
結合: スコアの高いものが隣接していれば
RAKE
ストップリスト: キーフレーズの中と隣接を比較する
結合: 同じ順で出現していれば
ストップリスト考察
ストップリストは「文字列→0/1」の関数とみなせる
「ストップワードで刻む」とは
https://gyazo.com/cdaa7d86db568a4ea3bf72d6e90a31b6
赤の部分は1-pにした上で「積が1」
「キーワードの中の出現回数」と「キーワードの隣の出現回数」を比較していたのと整合する
0/1でよいのか?
「の」とか、中にも入るが隣接にも入る
未知語はストップリストに入ってない
出現頻度の低い「キーワードに入れるべきでないトークン」があると困る
例えば入力にURLが紛れ込んだ場合
code::
f 名詞,一般,*,*,*,*,*
3 名詞,数,*,*,*,*,*
b 名詞,一般,*,*,*,*,*
1 名詞,数,*,*,*,*,*
af 名詞,一般,*,*,*,*,*
2 名詞,数,*,*,*,*,*
daee 名詞,一般,*,*,*,*,*
8 名詞,数,*,*,*,*,*
e 名詞,一般,*,*,*,*,*
942 名詞,数,*,*,*,*,*
b 名詞,一般,*,*,*,*,*
49 名詞,数,*,*,*,*,*
adbb 名詞,一般,*,*,*,*,*
2 名詞,数,*,*,*,*,*
e 名詞,一般,*,*,*,*,*
40 名詞,数,*,*,*,*,*
f 名詞,一般,*,*,*,*,*
0 名詞,数,*,*,*,*,*
c 名詞,一般,*,*,*,*,*
6746 名詞,数,*,*,*,*,*
f 名詞,固有名詞,組織,*,*,*,*
確率モデルにする案
future work
形態素解析自体やその他の系列ラベリングによく使われる
「キーフレーズ列の2回以上の出現」がCRFなどで使ってないグローバルな特徴になってる
これをうまく使うには??
キーフレーズ結合に関して
今はトークンの種類や個数を気にせずとにかく結合してる
'プレゼンをする \u3000\u3000↓ \u3000(行動直後'
複数回出現するので結合されてるが、全角空白がキーフレーズに入って欲しくはない
そもそもMeCabの段階で改行が消えてるが、改行はキーフレーズに絶対に入らないトークンになるべきでは?
間に挿入したトークンの「キーフレーズの中に出る確率」