teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

ご指摘ありがとうございます。少しでも理解いただけるように修正いたしました。よろしくお願いいたします。

2021/12/08 05:57

投稿

mlkwy35
mlkwy35

スコア1

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