特許文章版 分散表現:word2vecの学習済モデル ver1.0


分散表現公開

前回作った分散表現のバージョンアップ版(ver1.0)

特許版word2vec学習モデル(.model)214MB注意
特許版word2vec学習モデル(.model.wv.vectors.npy)3160MB注意
特許版word2vec学習モデル(.model.trainables.syn1neg.npy)3160MB注意

  • 2013~2015年に日本国特許庁で発行された全公開公報(150万件ほど)の全文を用いて学習
  • tokenizeはMeCab+NEologdです。
  • 次元数は300次元
  • ただし、データが重すぎてエラーが出てcolaboratoryでは動かない場合があります。動作が確認できたのはGCEの n1-highmem-8 (8 vCPUs, 52 GB memory) です。これくらいのスペックがないと動かないかもしれません。

です。

model.corpus_count #77222
model.vector_size #300
len(model.wv.vocab) #2831509

使い方

使い方は他の公開モデルと大体同じ↓
上記3つのファイルを同じフォルダに入れて、
/path/to/model/patent_w2v_d300_20200208.modelを適宜ファイルの場所に置き換えてもらい、
使ってください。

from gensim.models.word2vec import Word2Vec
model_path = '/path/to/model/patent_w2v_d300_20200208.model'
model = Word2Vec.load(model_path)

読み込みできれば、分散表現を作るなり、

word=""
results = model.wv.most_similar(positive=[word])
for r in results:
    print(r)

などで類似語を抽出するなり。

実験

2014年で既にword2vecモデルを作成、実験されたサイト(以下、「2014モデル」)があったので、それとの比較を。
※tokenizeや学習元のデータやパラメータが違うと思うので厳密な比較ではありませんが。

類似語

word = "情報処理装置" #@param {type:"string"}
results = model.wv.most_similar(positive=[word],topn=10)
wds =[]
for r in results:
    wds.append(r[0])
print(" ".join(wds))
比較 今回モデル(類似度上位10) 2014モデル
筆記具 ボールペン マーキングペン シャープペンシル 筆記用具 万年筆 ボールペンレフィル 筆記 ペン先 プラスチックチップ レフィル ボールペン 筆記 万年筆 消しゴム 水性ボールペン 水性インキ 筆記具用インキ 筆記用具 サインペン
自動車 車両 自動車用 輸送機器 内装部品 車両用 自動車部品 内装材 自動車分野 産業機器 車載用 乗用車 オートバイ 車両 車輌 車輛 二輪車 乗り物 乗物
スマートフォン 携帯電話 ノート型パソコン タブレット端末 モバイル機器 携帯情報端末 タブレットコンピュータ パソコン ノート型パーソナルコンピュータ ノートPC カーナビゲーションシステム PDA 携帯情報端末 パソコン pda 携帯型コンピュータ カーナビ
ラーメン 激戦区 うどん 中華料理 春雨 稲庭うどん ロングパスタ そうめん ウドン 日本そば きしめん うどん 味噌汁 スープ 麺類 麺 玉子
情報処理装置 演算処理装置 携帯型 ハードウェア構成 コンピュータ 制御装置 基板処理システム 処理システム 入力装置 CPU(CentralProcessingUnit) CPU 情報処理システム データ処理装置 コンピュータ装置 多機能周辺装置 情報処理プログラム
煩雑 面倒 高コスト 煩雑化 複雑 コスト高 煩雑さ 手間 繁雑 不要 非効率 繁雑 面倒 煩わしい 煩瑣 手間
円滑 スムーズ 効率的 速やか スムース 確実 迅速 安定的 容易 効果的 定常的 スムーズ スムース 確実 容易 迅速 速やか

ラーメン⇒「激戦区」は明らかに類義語ではない・・・w

類推語

positive = "プリンタ,カメラ"
negative = "印刷"results= model.wv.most_similar(positive=positive.split(","), negative=negative.split(","), topn=5)

wds=[]
for r in results:
    wds.append(r[0])
print("{}→({})".format(positive.split(",")[0]," ".join(wds)))
比較 今回モデル(類似度上位10) 2014モデル
印刷→プリンタ 通信→? 通信→(コントローラ 通信装置 CPU(CentralProcessingUnit) 外部装置 通信インターフェース) 通信→(通信制御装置 LAN データ通信 無線通信回線 無線通信網 ゲートウェイ装置 通信機器)
プリンタ→印刷 カメラ→? カメラ→(デジタルカメラ 撮像装置 ビデオカメラ プリンター 着脱マウント) カメラ→(撮影 撮像 被写体 撮像カメラ ステレオ撮影 テレビカメラ)

今回のモデルを使って出力してみた他の例:

positive = "飛行機" 
negative = "翼"
飛行機(電車 オートバイ 乗り物 電動カート バイク)

positive = "水素自動車,電気自動車"
negative = "電池"
水素自動車(燃料電池自動車 水素スタンド 天然ガス自動車 圧縮天然ガス ハイブリット自動車)

positive = "信州"
negative = "蕎麦"
信州(日刊工業新聞 誠文堂新光社 アンダーラボラトリーズ 技報堂 宝島社)

positive = "人間,ロボット"
negative = "心"
人間(操作者 ロボットアーム ユーザ 作業者 使用者)

人間から「心」を取ると「作業者」や「使用者」になってしまうのですな。心しようと思いました。

その他

そのうちこんな形の実験しないとです。