サイボウズラボ機械学習勉強会

キーフレーズ抽出

  • 一文以上の長い入力文字列から、一文未満の短い文字列をいくつか取り出す
  • 今回の話

単語頻度のアプローチ

  • 入力を単語に刻む
  • それぞれの単語の出現回数を数える
  • 「回数の多さ」をスコアにする
    • これをTF(Term Frequency)と呼ぶ
  • スコアの高いものを表示

問題点

  • 「の」や「を」のような単語の出現頻度が高い
  • これはどんな文章にも出現頻度が高い
  • スコアを下げたい

TF-IDF

  • 単語xが出現する文書の数を数える
    • DFの大きい単語は「ありふれた」単語
    • これをDF(Document Frequency)と呼ぶ
    • そこでDFが大きいほどスコアが小さくなるようにする、これがTF-IDF
  • (余談)
    • 「単語xが2回以上出現する文書の数」DF2との二軸でプロットするとキーフレーズに関して特徴的な分布が見られる(出現集中)のが面白い
    • logを取ったりするけど、あまり理論的な裏付けはなさそう
    • 「文書」の平均単語数などに影響を受ける
      • 書籍を使うなら1文書は「1冊の本」か「1ページ」か?
      • グループウェアなら1投稿か?1スレッドか?1スペースか?

本部長会問題

  • 「本部長会」はサイボウズの中ではこれ全体で具体的な繰り返されるイベントを指し示す言葉
  • しかし単語に刻むと「本」「部長」「会」に分かれてしまう
    • 書籍の意味の「本」や、その他のイベントの「会」と混ざってしまう
    • 「部長」という単語が高頻度だったとしても、そこから「本部長会のことか」と思うことは人間には難しい
  • 人間に見せるなら「複数単語の並び」をキーフレーズとして抽出することが必要

[TextRank]

  • “TextRank: Bringing Order into Texts”
  • 単語に刻んでバラバラに扱うと語順の情報がなくなる、これは良くない
  • そこで、単語を頂点、隣接関係を辺としてグラフを作成、これに固有値分析を掛けたものを単語のスコアとする
    • GoogleのPageRankにインスパイアされてるのでTextRankという名前
  • スコア上位1/3の単語が原文中で連続している場合、連結される
  • 問題点
    • Q: 高頻度語のスコアが高くなるのでは?
    • A: Yes、なのでTextRankでは名詞と形容詞だけを使う(名詞句アプローチ)

名詞句アプローチの問題点

  • 候補を絞りすぎ
    • 「エンジニアの知的生産術」も「100人100通りの働き方」もキーフレーズになり得ない
    • 「リーン・スタートアップ」は中黒で刻まれる
    • Scrapboxをよく使ってるユーザのデータを分析したらキーフレーズの1割〜3割は名詞形容詞以外を含んでいた→Scrapbox統計2

[RAKE]

  • Rapid Automatic Keyword Extraction
  • Automatic Keyword Extraction from Individual Documents
  • 西尾と同じ問題意識
    • “axis of evil”(悪の枢軸)をキーフレーズとして取り出したい
  • 仕組み
    • 1: まずストップリストに含まれている単語で分割する
    • 2: 同じ順で出現するキーフレーズがあれば間の単語も含めて結合する
    • image
  • ストップリストの作り方がキモ
    • TextRankの名詞句アプローチは、名詞形容詞以外を全部ストップリストに入れたことに相当

RAKEのストップリスト生成

  • 論文では2パターン6通り試している
    • パターンTF:
      • 出現頻度の高い単語はストップ対象という発想
      • 単語のDFが多いものを使う
    • パターンKA:
      • キーフレーズの隣に出現し、キーフレーズの中に出現しにくい単語はストップ対象という発想
      • キーフレーズの中での出現回数が、キーフレーズの隣での出現回数より多いなら、ストップリストから除外
  • 結果
    • KAが全面的に良い
    • TFではストップリストの数を増やすと性能が落ちる、KAだと上がる
    • KAだと「キーフレーズの中にも頻出する単語」がストップリストに入らないから増やせる
    • image

性能評価

  • 速度はTextRankより格段に速い
    • TextRankは大きな行列の固有値問題を解くのが重たい
  • 精度はF値と、適合率の両方でベスト
    • 適合率とはシステムがキーフレーズだと判定したもののうち、本当にキーフレーズだったものの割合
    • もっともTextRank系手法もこの後色々進化してる: PositionRankEmbedRank

追試

  • Wikipediaのリンク記法[[ ]]で囲われてる範囲をキーフレーズだとする
  • 1000ページ/2000ページでストップリストを生成
  • 他の1000ページに対してキーフレーズ抽出
  • 例: アンパサンド
    • INPUT アンパサンド (&amp;、英語名: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', 'アンパサンド (&amp;、英語名', '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」の関数とみなせる
  • 「ストップワードで刻む」とは
    • image
    • 赤の部分は1-pにした上で「積が1」
    • 「キーワードの中の出現回数」と「キーワードの隣の出現回数」を比較していたのと整合する
  • 0/1でよいのか?
    • 「の」とか、中にも入るが隣接にも入る
    • 未知語はストップリストに入ってない
    • 出現頻度の低い「キーワードに入れるべきでないトークン」があると困る
  • 例えば入力にURLが紛れ込んだ場合 :
f	名詞,一般,*,*,*,*,*
3	名詞,数,*,*,*,*,*
b	名詞,一般,*,*,*,*,*
1	名詞,数,*,*,*,*,*
af	名詞,一般,*,*,*,*,*
2	名詞,数,*,*,*,*,*
daee	名詞,一般,*,*,*,*,*
8	名詞,数,*,*,*,*,*
e	名詞,一般,*,*,*,*,*
942	名詞,数,*,*,*,*,*
b	名詞,一般,*,*,*,*,*
49	名詞,数,*,*,*,*,*
adbb	名詞,一般,*,*,*,*,*
2	名詞,数,*,*,*,*,*
e	名詞,一般,*,*,*,*,*
40	名詞,数,*,*,*,*,*
f	名詞,一般,*,*,*,*,*
0	名詞,数,*,*,*,*,*
c	名詞,一般,*,*,*,*,*
6746	名詞,数,*,*,*,*,*
f	名詞,固有名詞,組織,*,*,*,*

確率モデルにする案

  • future work
  • CRF
    • 形態素解析自体やその他の系列ラベリングによく使われる
  • 「キーフレーズ列の2回以上の出現」がCRFなどで使ってないグローバルな特徴になってる
    • これをうまく使うには??

キーフレーズ結合に関して

  • 今はトークンの種類や個数を気にせずとにかく結合してる
  • 'プレゼンをする \u3000\u3000↓ \u3000(行動直後'
    • 複数回出現するので結合されてるが、全角空白がキーフレーズに入って欲しくはない
    • そもそもMeCabの段階で改行が消えてるが、改行はキーフレーズに絶対に入らないトークンになるべきでは?
  • 間に挿入したトークンの「キーフレーズの中に出る確率」