【Python, Gensim】doc2vecで関連記事の見出しを抽出する試み
今回は、過去2回の記事*1*2でも使った日経新聞のツイッター(@nikkei)の投稿文のデータセットを用いて、類似する見出しを抽出しようという話です。とある見出しと類似する見出し、つまり関連記事を取り出す試みになります。
doc2vec
この問題に取り組むため、今回は「doc2vec」*3というモデルに着目しました。このモデルはニューラルネットワークで文書のベクトル表現を学習する枠組みで、文書分類など文の類似度を測定するためにも使われます。
実装
実装には、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行ごと読み込んでいます。
続けて、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から順に試していくのが良い気がしています。
*3:Quoc Le QVL, Tomas Mikolov: Distributed Representations of Sentences and Documents, Proceedings of the 31 st International Conference on Machine Learning, Beijing, China, 2014. JMLR: W&CP volume 32.
*5:doc2vec(Paragraph Vector) のアルゴリズムkitayamalab.wordpress.com
*7:Python と gensim で doc2vec を使うkitayamalab.wordpress.com