質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

Gensim、Word2Vecを用いたシステム開発について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 312

score 29

文章を単語ごとに区切り、その単語のそれぞれをWord2Vecを用いてベクトル化し、その単語のベクトルを足し合わせて割り、文書のベクトルを作成するといったようなシステムを現在考えております。ですが、開発にあたって以下の問題が現在発生しております。

以下のような配列ならば、学習済みのモデルに全ての言語が存在しているので、配列を作成することができるのですが、
print(tokensSituation[1])
['単身', '生活', '認知症', 'サービス', '拒否']

以下のような配列ならば、配列を作成することができません。
print(tokensSituation[3])
['本人', 'の', 'サービス', '利用', 'の', '受け入れ', '拒否', 'が', 'ある']

その配列を作成するにあたって以下のような、プログラムを用いています。

配列(文章が入っている)をさらに配列化

for i in range(len(lis)): 
tokensSituation[i]=tokensSituation[i].split(None)

文書ベクトルの取り出し

vectorSituation = []

上手くいかないときは空ベクトルを入れる

for i in range(len(tokensSituation)):
try:
vectorSituation.append(model.wv[tokensSituation[i]])
except:
vectorSituation.append("")

成功した場合は以下のようになります。
print(vectorSituation[2])
[[ 0.214311    0.0763293  -0.15200703 -0.5290254   0.41505465 -0.14374866
-0.1341153   1.6714561  -0.32641277 -0.29895762 -0.24816583 -0.20321406
0.10796727 -0.55094725  0.27393502  0.01861681  0.12763897 -1.0396957
-0.07557113  0.02218909 -0.25819677  0.4510418   0.5632597  -0.52726966
-0.32833436  0.7289277   0.2308788  -0.70520157 -0.68929267  0.8254075
0.5232958   0.5211772  -0.73326635  0.9513962   0.47992742  0.51736903
-0.4802426  -0.2987823  -0.02941655 -0.3191735   0.36027023 -0.6644283
-0.3570222  -0.5372858   0.47830492  0.7038007   0.5130014   0.29020625
-0.02263755  0.633224   -0.05110889 -0.53327924  0.5052781   0.16690992
-0.5415479   0.06546304  0.01086431 -0.28765035  0.77242476 -0.3894536
-0.38116375  0.40702268 -1.3164475  -0.880887   -1.0531039   0.7047993
-0.515486   -0.6339134  -0.33423704 -0.81290007  0.35958564  0.94572353
-0.6440719  -1.1558281  -0.85172623  0.4126607  -0.5693497  -0.6200748
0.02033455  0.26306844 -0.3101573  -0.06374624 -0.40636164 -0.22165595
0.33404803  0.44969422 -0.84844774 -0.61118644  0.09472755 -0.17939241
0.17646971  1.0453675  -0.15476878 -0.5892942  -0.9322525  -0.16863802
0.17203142 -0.11771914  0.2524703  -0.13034603  0.5048813   0.79845566
-0.15936193  0.9839085  -0.59136915  0.5448013   0.30567595  0.3828392
-0.54085344 -0.8093304   1.2623922  -0.09587381  0.7555552  -0.4865914
-0.06827059 -0.05245666 -0.5349524   0.63968694  1.0497452   0.17983952
-0.01247313  0.6856805  -0.30855924 -0.20797628 -0.35864815 -0.06781255
0.2487806   0.38646418  0.15219611  0.21061708  1.0515122  -0.9730945
0.32896173 -0.84513026  0.4629758  -0.17268579  0.36211574 -0.68151677
-0.15703839 -1.0888574  -0.38603562 -0.52598035  0.4266147  -0.41019326
-0.55824864  0.30351368 -0.5989914  -0.02958382  0.83062357  0.4875426
0.04386955 -0.231299   -0.7354047   0.00927639  0.67622095 -0.41364112
-0.13425621  0.33664456  0.05408203 -1.4569676   0.01477764 -0.07543167
-0.8294748  -0.15443498 -0.4174124  -0.19840425 -0.70056593  0.7346665
-0.3391793  -0.15621033  0.4633026  -0.48280966  0.04982495  0.51888126
0.6029025   0.8520094  -0.9558713  -0.09466203  0.20855515  2.0263505
0.41342095  1.1731846  -0.5133959   0.7334054  -1.3457522   0.2444181
0.73714256  0.96892965 -0.6001914  -0.4871037  -0.53259593 -0.35659862
-0.21584105  0.7219355   0.55300343  0.50555307 -0.24949794  0.5068422
-0.774185    0.3395956 ]]
しかし、失敗した場合は空です。
どうすれば、modelにない単語だけ避けて、modelにある単語はベクトルを取得することができるでしょうか。
そのプログラムについてご教授ください。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

前提として、前処理でできるだけなんとかしましょう(ストップワード除去等)。NLPでは前処理は大切です。また、語彙の豊富な分散表現辞書をもってきましょう。

コードですが、

vectorSituation.append("")


は空文字列なんか入れても駄目なのでは。単にpassしておけば意図通り動きませんかね。

正常ならnumpy配列が入るはずなので、shapeをそろえた要素すべてが0のnumpy配列でもいいですが、それなら入れるだけ無駄です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

gensimはモデルに登録されている単語一覧を取り出すことができるので、ベクトル化したい配列とこの単語一覧を照合して単語一覧にないものを除去するコードを追加するといいと思います。

ただ、質問からはモデルがgensimで構築されているかわからないので、保証はできません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/03 20:02 編集

    うろ覚え気味ですが、gensimならmodel.wvは辞書ライクなのでinでいけたはずです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る