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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

2060閲覧

Rubyで複数値で cos類似度を計算したい

abab7200

総合スコア120

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2018/05/24 10:48

自然言語処理の勉強をしています。参考サイトを元に複数値でcos類似度を計算し、値をソートして返したいのですが、やりたい事に対してのコードイメージが沸かず、どなたか指針やヒントをいただければと思い投稿しました。

やりたい事

1:文章を引き渡す(文章はN個)
("Bootstrap","Ruby O Rails","Bootstrapで画像スライダー","Bootstrapでモーダル")

2:下記3つの組み合わせで解析
"Bootstrap"と"Ruby O Rails" 
"Bootstrap"と"Bootstrapで画像スライダー"
"Bootstrap"と,"Bootstrapでモーダル"

4:cos類似度を算出

5:返り値でcos類似度が高い組み合わせをソートして返す

2次元配列や繰り返し処理などを利用するかと思いますが、処理に対しての何の処理が必要かのイメージがついておりません。

どなたかご助力いただけると大変大変助かります。

require 'natto' require 'matrix' module CosSimilarity def calculate(text1, text2) a1 = break_up(text1) a2 = break_up(text2) uniq_words = (a1 + a2).uniq f1 = make_flags(uniq_words, a1) f2 = make_flags(uniq_words, a2) v1 = Vector.elements(f1, copy = true) v2 = Vector.elements(f2, copy = true) return v2.inner_product(v1)/(v1.norm() * v2.norm()) end def break_up(text) arr = Array.new nm = Natto::MeCab.new nm.parse(text) do |n| surface = n.surface feature = n.feature.split(',') # 品詞が名刺、かつ記号っぽくなければ採用 if feature.first == "名詞" && feature.last != '*' arr.push(surface) end end arr end def make_flags(uniq_words, elements) frags = [] uniq_words.each do |word| flag = elements.include?(word) == true ? 1 : 0 frags.push(flag) end frags end end CosSimilarity.calculate("Bootstrap","Ruby O Rails")

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

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

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

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

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

guest

回答1

0

ベストアンサー

rubyを知らないのでpython風擬似コードで示します。

とりあえず類似度行列を作る

作ります。

python

1cos_sim_matrix = n*nの二次元配列にしておく 2i = 0 3for doc1 in docs: 4 j = 0 5 for doc2 in docs: 6 cos_sim_matrix[i][j] = cos_sim(doc1, doc2) # これだと行列の上下が同じなのに計算してて無駄だから、何か工夫した方が良いです 7 j += 1 8 i += 1

ある文書に対して類似度の高い順に並べる

単にその文書に該当する行列の行か列を抜き出してあげるだけです。これだと未知データは取り扱えませんが、未知データの場合は既知の全データとコサイン類似度を計算してソートすれば良いだけなので、もっと簡単です。

python

1def similars(doc): 2 index = docs.index(doc) # これもあまりうまくない処理なので、実際には文書とインデックスの対応を入れた辞書など作られてはどうでしょうか 3 row = cos_sim_matrix[index] 4 row.pop(index) # doc自身は落とす 5 sorted_lst = sorted(zip(range(len(row)), row), reverse=True) # 大きい順にソート 6 return [docs[i] for i, sim in sorted_lst] # 文書のリストにして返す

ちなみに

自然言語処理の記事は、pythonだとググれば幾らでも出てきます。とりあえずいろいろ動かしてみたいなら、そっちを見ると楽できます。

投稿2018/05/24 12:48

hayataka2049

総合スコア30933

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

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

abab7200

2018/05/26 04:44

ありがとうございます。 pythonで一旦確認してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問