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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Python

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

自然言語処理

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

Q&A

解決済

2回答

2415閲覧

Pythonのcos類似度が0になる原因

vuldo

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

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

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2021/10/27 07:00

編集2021/10/28 04:32

前提・実現したいこと

現在Jupiter NoteBookのpython3.Xを用いて,
名詞などをKeyWordとして文章の類似度を測るシステムを作っており,
方法としては,文章はTF-IDfでベクトル化し,
その後KeyWordを任意で決めてそれをもとにcos類似度でKeyWordに近い文章を見つけます.
しかし,抽出した文章タイトルは妥当なのですが,類似度が全て0になっておりその原因が特定できませんでした.
エラー関係ではないのですが,もしよろしければ教えていただけると助かります.
よろしくお願いいたします.

実行に必要なデータは以下に挙げております(約20MB).
・Re_AllWord.txt (各文章における単語群list)
・Re_AllTitle.txt (各文章のタイトル)
・inf.csv     (上記2ファイルの紐づけの確認用)
・merosu.txt (類似度を測るために用いた単語群)
https://38.gigafile.nu/1126-548e963235e3f9919a804f109419fb42

該当のソースコード

python

1import pickle 2import numpy as np 3import csv 4import pandas as pd 5import re 6import numpy as np 7from sklearn.metrics.pairwise import cosine_similarity 8from sklearn.feature_extraction.text import CountVectorizer 9from sklearn.feature_extraction.text import TfidfTransformer 10 11 12 13#呼び出し 14f = open("Re_AllWord.txt","rb") 15Word = pickle.load(f) 16 17f = open("Re:AllTitle.txt","rb") 18Title = pickle.load(f) 19 20df = pd.read_csv('inf.csv', header=0, encoding = 'sjis_2004') 21name = df["題目"].tolist() 22 23 24### 全データのTF-IDF ### 25Tname = [] 26 27vectorizer = CountVectorizer(token_pattern=u'(?u)\b\w+\b',min_df=3,max_df=5, max_features=10000) 28transformer = TfidfTransformer() 29tf = vectorizer.fit_transform(Word) # 単語の出現頻度を計算 30tfidf = transformer.fit_transform(tf) 31 32X = tfidf.toarray() 33ALL = [X,Title] 34 35 36### 類似度を確認したいデータの準備 ### 37""" 38### データの用意 ### 39test1 = ['君 私 犬 好き'] 40test2 = ['私 犬 嫌い'] 41test3 = ['あなた 木 薄い'] 42test4 = ['貴行 殿 薩'] 43corpus = test1+test2+test3+test4 44""" 45f = open("merosu.txt","rb") 46merosu = pickle.load(f) 47kye_words = merosu 48#kye_words = ['メロス セリヌンティウス'] 49#kye_words = ['犬'] 50 51sample_tf = vectorizer.transform(kye_words) 52# sampleのTF-IDFを計算する 53sample_tfidf = transformer.transform(sample_tf) 54 55# コサイン類似度の計算 56similarity = cosine_similarity(sample_tfidf, ALL[0])[0] 57topn_indices = np.argsort(similarity)[::-1][:5] 58 59for i in range(len(topn_indices)): 60 print(Title[topn_indices[i]]) 61 print(similarity[i]) 62  #上記を"similarity[topn_indices[i]]"で出てきました. 63 Tname.append(Title[topn_indices[i]]) 64 65 66#コメントアウトの箇所は,「ALL = [X,Title]」での文章タイトルがcsvファイルと一致しているか確認してます 67for i in range(len(Tname)): 68 #print(Tname[i]) 69 for j in range(len(name)): 70 if(Tname[i] == name[j]): 71 num = j 72 html =df.iloc[j][0] 73 title=df.iloc[j][1] 74 Url =df.iloc[j][2] 75 #print(df.iloc[j][1]) 76

試したこと

cos類似度の算出は,以下を参照いたしました.
https://www.pytry3g.com/entry/cosine_similarity

その際,コードにある短いコーパスでKeyWordを「犬」にすると類似度は出てきたため,単語数の兼ね合いかと思いある文章に出現した単語すべてをKeyWordにしたのですが結果は類似度は全て0になっていました.

補足情報(FW/ツールのバージョンなど)

今回対象文書数が11176文章と多く,
対象のデータは青空文庫の形態素解析データ集
http://aozora-word.hahasoha.net/download.html 内の,
・utf8_all.csv.gz     (全文章の形態素解析結果)
・aozora_word_list_sjis.zip(文章とタイトルの紐づけ用)
ギガファイルのデータはここから作成しました.

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

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

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

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

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

guest

回答2

0

for i in range(len(topn_indices)):
print(Title[topn_indices[i]])
print(similarity[i])
Tname.append(Title[topn_indices[i]])

内の
print(similarity[i])を
similarity[topn_indices[i]]に変更したらいけました.

投稿2021/10/28 04:34

vuldo

総合スコア1

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

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

0

ベストアンサー

Qiitaの cos類似度の次元の呪いをお祓いしてみた という記事は読まれたことがありますか?
標本サイズが大きくなればなるほど、「無作為な2データ間」での相関係数が0に近づくという問題に関しての解説です。

対象文書が1万点以上、データ量は20MB(漢字1文字が2バイトだとすると、1000万文字)と巨大なデータを扱おうとしているところに、ひょっとすると落とし穴があるにではないかと思った次第です。

対象文書を100点以下、1文書の文字数を上限1万文字以下、などというように対象データを小さくして動作確認をしてみては如何でしょうか。
(思い付きなので、うまくいくかどうか保証の限りではありませんが)

投稿2021/10/27 08:19

coco_bauer

総合スコア6915

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

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

vuldo

2021/10/28 03:35

返信が遅くなりすみません. 提案してくださった方法で文章数を100で実行したら類似度は問題なく算出されました.ありがとうございます. KeyWordによる類似度計算の前に文章数を削って再度TF-IDFを行うような作業などが必要そうですね.まだ色々と試すことが出てきました. 教えていただき,ありがとうございました.
vuldo

2021/10/28 04:37

すみません,自身のcos類似度のインデックス番号指定が間違っていました. お手間をかけてしまい,すみません.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問