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

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

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

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

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

Q&A

解決済

1回答

4057閲覧

pythonで、Excelから読み込んだ文書リストをMeCabで形態素解析し、文書間類似度を計算したいです、、、

hasegawahakase

総合スコア1

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

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

0グッド

0クリップ

投稿2021/10/14 06:18

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)]

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

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

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

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

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

guest

回答1

0

ベストアンサー

mplg関数のfor row~ループの中にprint([row])と入れてみて、その表示結果を確認してみてください。
['リンゴ\tリンゴ\tリンゴ\t名詞-一般\t\t']というふうに表示されると思います。

つまりpos=row.split("\t")[1]ではなくpos=row.split("\t")[3]であるべきだと思います。
また、np.linalingnp.linalgが正しいです。

投稿2021/10/14 08:36

can110

総合スコア38293

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

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

hasegawahakase

2021/10/15 03:16

エラーが解決しました! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問