Excelから読み込んだ大量の単文書間の類似度をpython,Mecabをつかって計算したい
プログラミングのぷの字もわからない、超初心者です。急遽、Excelの表にまとめられた大量のインタビューの結果から、各発話(単文書:例「これがかっこいいと思います。」,「私はこれが好きです。」など)間の類似度を計算する必要がでてきてしまい、文書間類似度を計算するシステムを作るために、ネットをあさりながらPython上でMecabを使った形態素解析までできるようになりました。しかし、そのあとの文書をベクトル化してcos類似度を計算する段階で、以下のようなエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "C:\Users\lklng\test.py", line 59, in <module> vecs=tfidf(word_list) File "C:\Users\lklng\test.py", line 42, in tfidf vectorizer=TfidfVectorizer( File "C:\Users\lklng\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 1850, in fit_transform X = super().fit_transform(raw_documents) File "C:\Users\lklng\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 1203, in fit_transform vocabulary, X = self._count_vocab(raw_documents, File "C:\Users\lklng\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py", line 1134, in _count_vocab raise ValueError("empty vocabulary; perhaps the documents only" ValueError: empty vocabulary; perhaps the documents only contain stop words [Finished in 0.942s]
該当のソースコード
python
1 2import pandas as pd 3import MeCab as mc 4from time import sleep 5import numpy as np 6from sklearn.feature_extraction.text import TfidfVectorizer 7 8##関数定義 9#step1:テキストデータをデータフレームとして読み込む 10def get_text(): 11 text_list="" 12 csv_input=pd.read_csv(filepath_or_buffer="C:\Users\lklng\OneDrive\デスクトップ\Book1.csv",encoding="utf_8",sep=',',engine="python") 13 text_list=csv_input["発話内容"].values 14 # 指定したカラムだけ抽出したDataFrameオブジェクトを返却します。 15 #値を二次元配列形式?で返却します。 16 #返却される型は、numpy.ndarray 17 #行インデックス、カラムインデックスの順番で指定して項目の値を取得できます。 18 return text_list 19 20 21 22# Step2:それらをMeCabで形態素解析。名詞だけ抽出。 23def mplg(text_list): 24 word_list="" 25 m=mc.Tagger("-Ochasen") 26 m1=m.parse(text) 27 for row in m1.split("\n"): 28 word=row.split("\t")[0]#タブ区切りになっている1つ目を取り出す。ここには形態素が格納されている 29 if word=="EOS":#EOS は end of sentence で文末 30 break 31 else: 32 pos=row.split("\t")[1]#タブ区切りになっている2つ目を取り出す。ここには品詞が格納されている 33 slice=pos[:2] 34 if slice=="名詞": 35 word_list=word_list+" "+word 36 return word_list 37 38#step3:文書ベクトル化関数 39def tfidf(word_list): 40 docs=np.array(word_list)#Numpyの配列に変換 41 #単語をベクトル化して、TF-IDFを計算する 42 vectorizer=TfidfVectorizer( 43 token_pattern=u'(?u)\b\w+\b'#文字列長が 1 の単語を処理対象に含めることを意味します。 44 ).fit_transform(docs) #fit_transform:BagofWords(単語の出現回数) へ 45 vecs=vectorizer.toarray() 46 return vecs 47 48#step4:類似度行列作成 49def cossim(v1,v2): 50 #二つのベクトルの内積をそれぞれのL2ノルムで割る 51 return np.dot(v1,v2) / (np.linaling.norm(v1) * np.linaling.norm(v2)) 52 53##実装 54word_list=[] 55texts=get_text() 56for text in texts: 57 word_list.append(mplg(text)) 58 59vecs=tfidf(word_list) 60print(cossim(vecs[1],vecs[0]))
試したこと
エラーメッセージをなんとか読んで、ストップワードしかないからだめらしいというところまではわかりましたが、なにをどうすればいいのかわかりません。助けてください、、、。(質問の仕方もこれでよいのかわかりません、、、わかりにくい内容、的外れなことをやっているようでしたら申し訳ありません、、)
補足情報(FW/ツールのバージョンなど)
python.3.8.8 (default, Apr 13 2021, 15:08:03) [MSC v.1916 64 bit (AMD64)]
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/15 03:16