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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

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

Q&A

1回答

3471閲覧

pythonでコサイン類似度をループで計算する

mangopurin

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

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

0グッド

0クリップ

投稿2018/12/13 06:48

前提・実現したいこと

pythonでテキスト間のcos類似度を求めています。
最終的には膨大なテキストに対して、cos類似度を計算しようと考えています。

cos類似度の分母のループがうまく回りません。

.txtには以下の文が入っています。
私はりんごを食べました。,私はりんごを食べました。,私はみかんを食べました。,私はぶどうを食べました。

4つの文が入っており、4つの文書から2つの文書を組み合わせて計算するので6通りの結果が出るはずですが、うまく出ません。

エラーは出ないので、どこが間違っているかわからない状態です。

御享受、よろしくお願いします。

該当のソースコード

python

1import pprint 2import re 3import sys 4import MeCab 5import math 6import numpy 7from scipy.spatial.distance import pdist, squareform 8sentence_data = open("data2.txt","r")#ファイルのオープン 9#行ごとに読み込んでリストデータ 10sentence_read = sentence_data.readlines() 11 12sentence_read_str = ','.join(sentence_read) 13 14sentence = sentence_read_str.split(",") 15 16num = len(sentence) 17 18result = [] 19print("全文書数") 20print(num) 21 22 23a = [] 24 25 26for i in range(num): 27 tagger = MeCab.Tagger() 28 result.append(tagger.parse(sentence[i])) 29 print("形態素解析した結果 result") 30 print(result) 31 32 33 34 35#文章を形態素解析して、文章事の単語をリストへ 36wordCount = {}#辞書 37allCount = {} 38sub_tfstore = {} 39tfcounter = {} 40tfstore = {} 41sub_idf = {} 42idfstore = {} 43merge_idf = {} 44tfidf = {} 45merge_tfidf = {} 46wordList = [] 47 48sum = 0 49 50for i in range(num): #resultに形態素解析の結果 51 wordList.append(result[i].split()[:-1:2])#wordListにresultを加える 52 print("単語のみ") 53 print(wordList) 54 55for i in range(num):#iをnum分まわす 56 for word in wordList[i]:#wordをwordList分まわす 57 allCount[i] = wordCount.setdefault(word,0)#wordCountのwordが0 58 wordCount[word]=1 59 allCount[i] = wordCount 60 61 wordCount = {} 62 print("単語の数") 63 print(allCount) 64 65for i in range(num):#tfの分母を計算 66 for word in allCount[i]: 67 sum = sum + allCount[i][word] 68 sub_tfstore[i] = sum 69 sum = 0 70 print(sub_tfstore) 71 72for i in range(num): 73 for word in allCount[i]: 74 tfcounter[word] = allCount[i][word]*1.0/sub_tfstore[i] 75 tfstore[i] = tfcounter 76 print("tfの値") 77 print(tfstore) 78 tfcounter = {} 79 80for i in range(num): 81 for word in wordList[i]: 82 wordCount.setdefault(word,0) 83 for word in allCount[i]: 84 wordCount[word] += 1 85 sub_idf = wordCount 86 print("単語の文章あたりの出現回数") 87 print(sub_idf) 88 89for i in range(num): 90 for word in allCount[i]: 91 idfstore[word] = math.log(1.0*math.fabs(num)/math.fabs(sub_idf[word])) 92 merge_idf[i] = idfstore 93 idfstore = {} 94 print("idfの値") 95 print(merge_idf) 96 97 98#tfidfの計算 99for i in range(num): 100 for word in allCount[i]: 101 tfidf[word] = tfstore[i][word]*merge_idf[i][word] 102 merge_tfidf[i] = tfidf 103 tfidf = {} 104 print("tfidfの値") 105 print(merge_tfidf[0]) 106 107print("") 108print("tf-idfの値") 109for i in range(num): 110 for word,count in sorted(merge_tfidf[i].items(),key = lambda x:x[1],reverse = True): 111 print('text%d: %-16s %2.3f' % (i+1,word,count)) 112 113length = [] 114sum = 0.0 115for x in merge_tfidf: 116 for key,value in merge_tfidf[x].items(): #for key,value in merge_tfidf[1].items() 117 sum = sum + value*value 118 length.append(sum) 119 length[x] = math.sqrt(length[x]) 120 sum = 0.0 121print("各テキストのベクトル長 cos類似度の分母") 122print(length) 123 124print("") 125print("") 126 127 128 129 130#ここがうまくまわりません 131#cos類似度 分母 文書の組み合わせ 132dotProduct = 0.0 133dP = [] 134result = 0.0 135for x in merge_tfidf: 136 for Ka,Va in merge_tfidf[x].items() : 137 for y in merge_tfidf: 138 for Kb,Vb in merge_tfidf[y].items() : 139 if Ka == Kb : 140 dotProduct += Va*Vb 141 142 dP.append(dotProduct) 143 result += dotProduct 144 print(dotProduct) 145 dotProduct = 0.0 146 print("------------") 147 print("文書の組み合わせ cos類似度の分子"+str(x)+":"+str(result)) 148 print("------------") 149 result = 0.0 150

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

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

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

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

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

guest

回答1

0

最後のループが文書の組み合わせになっていなくて、
各文書に含まれる単語について全ての文書に対して計算している
って感じになってて多分cos類似度の計算になっていないと思います。

文書の組み合わせを作りたいとしたら、色々ありますが、例えば

pyhton

1for x in range(num-1): 2 for y in range(1, num): 3 (cos類似度の計算)

みたいになると思います。

投稿2019/04/25 10:59

daesaka

総合スコア136

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問