論文からキーワード抽出してキーワード間の関係性を可視化した


本記事でやったこと

  • KDD2018のホームページをスクレイピングし、論文のタイトル、アブストラクトを取得
  • TF-IDF法により各論文からキーワードを抽出
  • キーワード間の共起に基づきグラフを構築し、グラフを可視化

本記事のコードはGitHubにて公開しています。

スクレイピングより論文のタイトル、アブストラクトを取得

以下のコードにより、KDD2018のホームページをスクレイピングし、論文のタイトル、アブストラクトを取得します。

papers = {}
target_url = 'http://www.kdd.org/kdd2018/accepted-papers'
r = requests.get(target_url)
soup = BeautifulSoup(r.text, 'lxml')
for i, item in enumerate( soup.select('a[href^="http://www.kdd.org/kdd2018/accepted-papers/view/"]') ):
    title = item.get_text()
    url = item.get('href')
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    s = soup.find('div', {'class': 'g-mb-60'})
    author = s.find('h6').get_text()
    author_list = [ n.strip() for n in author.split(';')]
    abst = s.find('p').get_text()

    paper = {}
    paper['title'] = title
    paper['author'] = author_list
    paper['abst'] = abst
    papers[i] = paper

TF-IDFによる論文のキーワード抽出

- TF-IDF法とは

TF(Term Frequency, 単語の出現頻度)とIDF(Inverse Document Frequency, 逆文書頻度)を掛け合わせることにより、各文書における単語の重要度を表すスコアを算出できる手法

本記事では、得られた単語の重要度を用いて各論文のキーワードを抽出します。TF-IDF法について詳細に知りたい人は具体例とかもあってわかりやすいので以下のサイト等を参考に。

TF-IDF法についての参考サイト

- キーワード抽出結果

TF-IDF法により各論文から以下のように単語の重要度が取得される。

そして、単語の重要度が閾値より大きいものをその論文のキーワードとする。
各キーワードを含む論文を整理すると以下のようになる。KDD2018はデータマイニングに関する国際会議であるため、"graph"や"cluster(clustering)"というキーワードを含む論文が多い。

キーワードに基づき論文の関係性を可視化

- キーワードに基づき論文の関係性を表すグラフを定義

以下のようなグラフを作成する。
ノード:論文、キーワードをノードとして定義する
エッジ:論文とその論文に含まれるキーワード間にエッジを定義する

- グラフ可視化

グラフの可視化にはGephiを使用し、力学モデルによりノードを配置しています。可視化結果は以下の図です。緑色の文字がキーワード、ピンク色のxが論文です。

上図では、グラフにおけるノードの次数が大きいほど、キーワードの文字サイズを大きくしています。
すなわち、KDD2018では"graph", "recommend", "cluster(clustering)"といったキーワードを含む論文が多いことが確認できます。

また、このグラフは論文上でのキーワード共起に基づきエッジが定義されています。
よって、このグラフから下図のように共起したすいキーワード群を確認することができます。

"risk"と"medic(medical)"や"visual"と"cnn"

"ad","campaign"と"auction"や"privaci","mobile"と"event"

終わりに

本記事では、データマイニングに関する国際会議KDD2018の論文からキーワード抽出して、キーワード間の関係性をグラフにより表現し可視化しました。

論文に出現するキーワードの共起に基づく関係性を何となく確認することができたような気がしましたが、
キーワード抽出、グラフの作り方、グラフの可視化方法などもっと頑張れるところがあったようには思います。