前提・実現したいこと
レビューデータのtfidfを使って情報量の多いレビューの抽出を行なっています。
手順としては
0. mecabを使ったレビュー文の形態素解析
0. ストップワードや品詞の指定による単語の取捨選択
0. scikit-learnを使った2の単語(名詞・一般)のtfidf算出
0. 各レビューのtfidfの平均値の算出
といった感じで3までは出来ているのですが、4がうまくいきません。
4に関してましてはこちらの記事の参考にしており、こちらを応用してレビューIDとtfidfの平均を出力し、tfidfの平均値をdfに格納したいと考えております。
なおMacを使用しており、言語はPython、Jupyter Notebookを使用しております。
初心者の質問で申し訳ございませんが回答のほどよろしくお願いします。
Python
1import pandas as pd 2df = pd.read_csv("review1.csv") 3#レビューデータにはレビューID、レビュー文、4つの評価項目の5段階評価、総合評価(4つの評価項目の平均)が格納されています。規約の関係でデータの詳細を載せることができません。 4 5#形態素解析を行い、その結果をデータフレームに格納 6import MeCab 7import re 8tagger = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') 9 10def leaving_space_between_words_column(text): 11 splitted = ' '.join([x.split('\t')[0] for x in tagger.parse(text).splitlines()[:-1]]) 12 return splitted 13df['形態素解析'] = df['レビュー文'].map(leaving_space_between_words_column) 14 15#名詞・一般のみを抽出し、データフレームに格納 16def leaving_space_between_meishi_column(text): 17 splitted = ' '.join([x.split('\t')[0] for x in tagger.parse(text).splitlines()[:-1] 18 if (x.split('\t')[1].split(',')[0] in ["名詞"]) and (x.split('\t')[1].split(',')[1] in ["一般"])]) 19 return splitted 20df['名詞'] = df['形態素解析'].map(leaving_space_between_meishi_column) 21 22#名詞・一般の単語のtfidf値出力 23from sklearn.feature_extraction.text import TfidfVectorizer 24def words_tfidfs(): 25 vectorizer = TfidfVectorizer(min_df=0.05) 26 X = vectorizer.fit_transform(df["名詞"]) 27 #print('feature_names:', vectorizer.get_feature_names()) 28 words = vectorizer.get_feature_names() 29 word_info = [] 30 for doc_id, vec in zip(df["レビューID"], X.toarray()): 31 #print('doc_id:', doc_id) 32 for w_id,tfidf in sorted(enumerate(vec), key = lambda x:x[1],reverse=True): 33 lemma = words[w_id] 34 TFIDF_scores = {"ID:{},word:{},tfidf:{}".format(doc_id,lemma,tfidf)} 35 #レビューID,手順3で求めた名詞・一般の単語,その単語のtfidf 36 word_info.append(TFIDF_scores) 37 return word_info 38 39#同一レビューIDのtfidfの平均値を求める 40def get_sent_score(): 41 sentence_info = [] 42 for doc in df: 43 sent_score = 0 44 for i in range(0,len(word_info)): 45 temp_dict = TFIDF_scores[i] 46 if doc["doc_id"] == temp_dict["ID"]: 47 sent_score += temp_dict["tfidf"] 48 tfidf_mean=average(sent_score) 49 temp = {"ID":eval(doc["doc_id"]),"TFIDF_mean":tfidf_mean} 50 sentence_info.append(temp) 51 52 return sentence_info 53 54#tempを出力したい 55sentence_score = get_sent_score() 56 57 58 59```### エラー文 60```python 61TypeError Traceback (most recent call last) 62/var/folders/jc/q646bg4n6sgbsq38v8vjg6bw0000gp/T/ipykernel_6972/3767257272.py in <module> 63----> 1 sentence_score = get_sent_score() 64 65/var/folders/jc/q646bg4n6sgbsq38v8vjg6bw0000gp/T/ipykernel_6972/1195801929.py in get_sent_score() 66 8 sent_score += temp_dict["tfidf"] 67 9 tfidf_mean=average(sent_score) 68---> 10 temp = {"ID":eval(doc["doc_id"]),"TFIDF_mean":tfidf_mean} 69 11 sentence_info.append(temp) 70 12 71 72TypeError: string indices must be integers
追記
先ほどの質問について説明が不足しておりご不便をおかけいたしました。関数のエラーについては解決できたのですが、次は別のエラーで苦労しています。有識者の方、ぜひ回答いただければと思います。
回答1件
あなたの回答
tips
プレビュー