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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

17597閲覧

PythonのWord2Vecの未知語への処理について

gymgym

総合スコア97

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/07/18 07:25

PythonでWord2vecを実行したのでが、

Python

1model = word2vec.Word2Vec.load("./review.model") 2w = model.similarity('悲しみ', 'だれも来ない')
KeyError: "word 'も' not in vocabulary"

このように未知語が入るとエラーが出ます。

未知語へのエラーを無視したい場合どのようにしたら良いのでしょうか。

また、無視ではなく、未知語への対処として効果的な手法があれば、アドバイスいただけたらありがたいです。

よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2018/07/18 07:32

word2vecはなんの実装を使っているんですか?
gymgym

2018/07/18 07:39

model = word2vec.Word2Vec(wordlist, size=100,min_count=5,window=5,iter=100) model.save("./review.model") このような実装でモデルを作成しました
quickquip

2018/07/18 07:49

その word2vec はなんですか? ということだったんですが。gensimっぽいですね。
hayataka2049

2018/07/18 08:32

KeyError: "word 'も' not in vocabulary"はKeyError: "word 'だれも来ない' not in vocabulary"の間違いという認識でいいですか?
gymgym

2018/07/19 03:23

quiquiさん。gensimでした。
gymgym

2018/07/19 03:25

hayataka2049さん。「だれ」、「来ない」はモデルに含まれているみたいなのですが、「も」がないというエラーだと考えています
guest

回答2

0

ベストアンサー

とりあえず無視できれば良いのなら、

python

1# 適当な変数に入れたとする 2word1 = "悲しみ" 3word2 = "だれも来ない" 4 5if word1 in model.wv and word2 in model.wv: 6 w = model.similarity(word1, word2) 7 # 何らかの処理 8 # ... 9else: 10 # 無視するときの何らかの処理 11 # ...

また、無視ではなく、未知語への対処として効果的な手法があれば、アドバイスいただけたらありがたいです。

効果的かどうかは微妙ですが、いちおうpredict_output_word()というメソッドがあって、前後の文脈の単語列を入れれば「これに近いかな」というのは出してくれます。

gensim: models.word2vec – Word2vec embeddings #gensim.models.word2vec.Word2Vec.predict_output_word

単語と確率を一緒に出してくれるので、信頼できそうなら使うとか(たいてい信頼できませんが)、既知の単語ベクトルを確率で重み付けして足し合わせて未知語の単語ベクトルとして使うとか、そんな感じで使えなくはありません。


ところで、gensimのWord2Vecsimilarity()等はぜんぶDeprecated(非推奨)になっているので、model.wv.similarity()などに書き換えておいてください。

gensim: models.word2vec – Word2vec embeddings #gensim.models.word2vec.Word2Vec.similarity

投稿2018/07/18 09:29

編集2018/07/18 09:30
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gymgym

2018/08/03 07:44

今更再び質問させていただきたいのですが、無視する時の処理として何も処理を行わずスキップしたいのですが、 else: pass で実行したら無視できると思ったのですがうまくいきませんでした。 もう少しアドバイスいただけたらありがたいです。
gymgym

2018/08/03 07:49

def word_emotion(word1,word2,model): if word1 in model.wv and word2 in model.wv: w = model.wv.similarity(word1, word2) else: pass return w UnboundLocalError: local variable 'w' referenced before assignment
gymgym

2018/08/03 07:49

現在、以上のようなエラーが出てしまいます
hayataka2049

2018/08/03 08:00 編集

if文の中身が実行されないとwに何も代入されないためですね。 類似度を計算できなかったときどんな処理をしたいですか? それによって修正方法が変わります ・0を返す ・Noneを返す(受け取った側でしかるべく処理してください) ・例外を投げる(これだと、wrapした意味があんまりないことになりますが) ・文脈から予測する(文脈の情報を投げないといけないので関数の引数が変わる。しょうじき難しい) 簡単なのはとりあえず0にしちゃうことです。else節でwに0.0を代入するだけですね。それが許されるタスクならそうしてください 許されないなら、工夫してください
gymgym

2018/08/06 04:26

回答ありがとうございます。 参考にさせていただきます。
guest

0

gensimで処理をする前に学習時に使用したコーパスを検索して、単語があればリストに残しなければ除外するというコードを追加してはいかがでしょうか。

細かいことですが、形態素解析をかけると「だれも来ない」はだれ、も、来、ないに分解されると思います。したがって、正しく分かち書きしたリストをgensimに与えればうまくいくかもしれません。

投稿2018/07/18 10:34

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問