u++の備忘録

【Python, Gensim】doc2vecで関連記事の見出しを抽出する試み

 今回は、過去2回の記事*1*2でも使った日経新聞ツイッター(@nikkei)の投稿文のデータセットを用いて、類似する見出しを抽出しようという話です。とある見出しと類似する見出し、つまり関連記事を取り出す試みになります。

doc2vec

 この問題に取り組むため、今回は「doc2vec」*3というモデルに着目しました。このモデルはニューラルネットワークで文書のベクトル表現を学習する枠組みで、文書分類など文の類似度を測定するためにも使われます。

 doc2vecの説明については、先行記事*4*5に譲ります。

実装

 実装には、PythonのGensimというライブラリを用いました。

ライブラリの導入

 先行記事*6を参考に、ライブラリを導入しました。

コード

 先行記事*7を参考に実装しました。

 最初に、ライブラリをインポートし、データセットを読み込みます。

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

# 空のリストを作成(学習データとなる各文書を格納)
training_docs = []

f = open(r'C:/output.txt')
lines = f.readlines() # 1行毎にファイル終端まで全て読む(改行文字も含まれる)
f.close()

次のような、見出しを分かち書きしたデータセットを1行ごと読み込んでいます。

f:id:upura:20170802174530p:plain

 続けて、doc2vecの学習を行います。

sent_id = 0

sentents = []
for line in lines:
    # 各文書を表すTaggedDocumentクラスのインスタンスを作成
    # words:文書に含まれる単語のリスト(単語の重複あり)
    # tags:文書の識別子(リストで指定.1つの文書に複数のタグを付与できる)
    sentents.append(line)
    sent = TaggedDocument(words=line, tags=['sent' + str(sent_id)])
    # 各TaggedDocumentをリストに格納
    training_docs.append(sent)
    sent_id += 1

# 学習実行(パラメータを調整可能)
# documents:学習データ(TaggedDocumentのリスト)
# min_count=1:最低1回出現した単語を学習に使用する
# 学習モデル=DBOW(デフォルトはdm=1:学習モデル=DM)
model = Doc2Vec(documents=training_docs, min_count=1, dm=1)

# 学習したモデルを保存
model.save(r'C:/doc2vec.model')
 
# 保存したモデルを読み込む場合
# model = Doc2Vec.load('doc2vec.model')
 
# ベクトル'sent1'を表示(型はnumpy.ndarray)
# print(model.docvecs['sent1'])

学習結果

 学習結果を調べるため、直近の10件の投稿について、それぞれ最も類似度が高い見出しを表示します。出力は「テスト用の見出し」「最も似ていると判定された見出し」「区切り線」の順になっています。

# 最近の10件とそれぞれ最も類似度が高い文書を表示
for i_line in range(10):
    most_similar = model.docvecs.most_similar('sent' + str(i_line), topn=1)
    print(sentents[i_line])
    print(lines[int(most_similar[0][0][4:])])
    print("----------------------")

出力結果

株,2,万,円,回復,、,膠着,相場,に,好,決算,の,風穴,

自民党,の,木村,太郎,衆院,議員,が,死去, ,10,月,に,補選,

----------------------
首相,、,大田,元,沖縄,知事,の,功績,たたえる, ,県民,葬,に,出席,

??,",揺れる,仮想,通貨, ,危う,さ,と,可能,性,",

----------------------
止まら,ぬ,「,脱,ガソリン,・,ディーゼル,車,」,ドミノ,

アジア,の,ライドシェア,市場,で,米,中,大手,の,陣取り,合戦,。,中国,の,配車,アプリ,最大手,、,滴滴,出,行,が,ソフトバンク,と,組み,東南アジア,最大手,の,グラブ,に,2,2,0,0,億,円,を,出資,し,ます,。,米,ウーバー,包囲,網,を,敷ける,か,。,?,アジア,で,ウー,バー,包囲,網,ソフトバンク,と,中国,滴滴, , ,:,

----------------------
ガソリン,3,週,連続,上昇, ,店頭,131,.,1,円,、,前週,比,0,.,2,円,高,

堀江,氏,V,B,、,宇宙,ロケット,29,日,打ち上げ, ,民間,単独,初,

----------------------
日経,平均,終値,、,3,日,ぶり,2,万,円,台,回復,

日経,平均,、,3,日,続落, ,終値,は,15,円,安,の,1,万,9883,円,

----------------------
日経,平均,終値,、,2,万,円,回復, ,4,日,ぶり,反発,

NY,原油,が,8,日,続伸, ,需給,改善,の,観測,で,、,金,は,3,日,続落,

----------------------
「,手のひら,返し,」,の,円,安, ,米,経済,へ,の,悲観,和らぐ,?,

日経,平均,、,3,日,ぶり,反落, ,終値,97,円,安,の,2,万,98,円,

----------------------
米,で,蓄電池,の,普及,加速, ,再生,エネ,と,合わせ,低,コスト,

醜聞,もみ消し,「,懇願,しろ,」, ,米,政権,が,キャスター,脅迫,か,

----------------------
日経,平均,、,上げ幅,を,縮小, ,国内,投資,家,が,売り,

日経,平均,続落,、,利上げ,の,先行き,警戒, ,東芝,が,大幅,安,

----------------------
日経,平均,、,午後,に,入り,伸び悩む, ,利益,確定,売り,で,

民,進,の,蓮,舫,代表,、,続投,表明, ,「,引き続き,最前線,で,」,

----------------------

 5、9個目辺りは似ている見出しが抽出されている気もしますが、なかなか上手くいっていない印象です。

今後の展望

 今後は、どの辺りに問題があるのか、改善の余地があるのか調べていきたいと思います。現在思い当たる可能性としては、以下のようなところです。

  1. データ数が足りない→新聞記事データベースのようなものから集める
  2. データの前処理不足
  3. 学習アルゴリズムやハイパーパラメータの調整不足

 上流過程の1から順に試していくのが良い気がしています。