質問編集履歴

1

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

2021/12/08 05:57

投稿

mlkwy35
mlkwy35

スコア1

test CHANGED
@@ -1 +1 @@
1
- 各レビューのTFIDF の平均を出したい
1
+ 各レビューのTFIDF の平均を出したいが、string indices must be integersのエラーが出てしまう。
test CHANGED
@@ -2,51 +2,49 @@
2
2
 
3
3
 
4
4
 
5
- 卒業研究でレビューデータのtfidfを使って情報量の多いレビューの抽出を行なっています。
5
+ レビューデータのtfidfを使って情報量の多いレビューの抽出を行なっています。
6
6
 
7
7
  手順としては
8
8
 
9
- 0. 番号リストmecabを使ったレビュー文の形態素解析
9
+ 0. mecabを使ったレビュー文の形態素解析
10
10
 
11
11
  0. ストップワードや品詞の指定による単語の取捨選択
12
12
 
13
13
  0. scikit-learnを使った2の単語(名詞・一般)のtfidf算出
14
14
 
15
- 0. 各レビューの tfidf合計/3で求めた名詞・一般の単語数(tfidfの平均値) の算出
15
+ 0. 各レビューのtfidfの平均値の算出
16
-
17
- といった感じで3までは出来ているのですが、4で引数の?エラーが出てしまいました。
18
16
 
19
17
 
20
18
 
19
+ といった感じで3までは出来ているのですが、4がうまくいきません。
20
+
21
+ 4に関してましては[こちらの記事](https://ichi.pro/python-de-tfidf-o-shiyoshite-tekisuto-o-yoyakusuru-207243463963268)の参考にしており、こちらを応用してレビューIDとtfidfの平均を出力し、tfidfの平均値をdfに格納したいと考えております。
22
+
21
23
  なおMacを使用しており、言語はPython、Jupyter Notebookを使用しております。
24
+
25
+
26
+
27
+
22
28
 
23
29
  初心者の質問で申し訳ございませんが回答のほどよろしくお願いします。
24
30
 
25
31
 
26
32
 
27
- ### ソースコード
33
+ ```Python
28
34
 
29
35
  import pandas as pd
30
36
 
31
37
  df = pd.read_csv("review1.csv")
32
38
 
39
+ #レビューデータにはレビューID、レビュー文、4つの評価項目の5段階評価、総合評価(4つの評価項目の平均)が格納されています。規約の関係でデータの詳細を載せることができません。
33
40
 
41
+
42
+
43
+ #形態素解析を行い、その結果をデータフレームに格納
34
44
 
35
45
  import MeCab
36
46
 
37
47
  import re
38
-
39
-
40
-
41
- def replace_number_to_zero(text):
42
-
43
- changed_text = re.sub(r'[0-9]+', "0", text)
44
-
45
- changed_text = re.sub(r'[0-9]+', "0", changed_text)
46
-
47
- return changed_text
48
-
49
-
50
48
 
51
49
  tagger = MeCab.Tagger ('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
52
50
 
@@ -58,11 +56,11 @@
58
56
 
59
57
  return splitted
60
58
 
61
-
62
-
63
59
  df['形態素解析'] = df['レビュー文'].map(leaving_space_between_words_column)
64
60
 
65
61
 
62
+
63
+ #名詞・一般のみを抽出し、データフレームに格納
66
64
 
67
65
  def leaving_space_between_meishi_column(text):
68
66
 
@@ -76,9 +74,9 @@
76
74
 
77
75
 
78
76
 
77
+ #名詞・一般の単語のtfidf値出力
78
+
79
79
  from sklearn.feature_extraction.text import TfidfVectorizer
80
-
81
-
82
80
 
83
81
  def words_tfidfs():
84
82
 
@@ -102,37 +100,45 @@
102
100
 
103
101
  TFIDF_scores = {"ID:{},word:{},tfidf:{}".format(doc_id,lemma,tfidf)}
104
102
 
103
+        #レビューID,手順3で求めた名詞・一般の単語,その単語のtfidf
104
+
105
105
  word_info.append(TFIDF_scores)
106
106
 
107
107
  return word_info
108
108
 
109
109
 
110
110
 
111
+ #同一レビューIDのtfidfの平均値を求める
112
+
111
113
  def get_sent_score():
112
114
 
113
115
  sentence_info = []
114
116
 
115
- for doc in df["レビュー文"]:
117
+ for doc in df:
116
118
 
117
119
  sent_score = 0
118
120
 
119
121
  for i in range(0,len(word_info)):
120
122
 
121
- sent_score = word_info[i]
123
+ temp_dict = TFIDF_scores[i]
122
124
 
123
- if df["レビューID"] == TFIDF_scores["ID"]:
125
+ if doc["doc_id"] == temp_dict["ID"]:
124
126
 
125
- sent_score += TFIDF_scores["tfidf"]
127
+ sent_score += temp_dict["tfidf"]
126
128
 
127
- temp = {"ID":df["レビューID"],"TFIDF_total":sent_score}
129
+ tfidf_mean=average(sent_score)
128
130
 
129
- sentence_info.append(temp)
131
+ temp = {"ID":eval(doc["doc_id"]),"TFIDF_mean":tfidf_mean}
130
132
 
131
-
133
+ sentence_info.append(temp)
134
+
135
+
132
136
 
133
137
  return sentence_info
134
138
 
135
139
 
140
+
141
+ #tempを出力したい
136
142
 
137
143
  sentence_score = get_sent_score()
138
144
 
@@ -140,15 +146,13 @@
140
146
 
141
147
 
142
148
 
143
- ### エラー
144
-
145
- word_infoが読み込まれていない。
146
149
 
147
150
 
151
+ ```### エラー文
148
152
 
149
- ---------------------------------------------------------------------------
153
+ ```python
150
154
 
151
- NameError Traceback (most recent call last)
155
+ TypeError Traceback (most recent call last)
152
156
 
153
157
  /var/folders/jc/q646bg4n6sgbsq38v8vjg6bw0000gp/T/ipykernel_6972/3767257272.py in <module>
154
158
 
@@ -156,22 +160,28 @@
156
160
 
157
161
 
158
162
 
159
- /var/folders/jc/q646bg4n6sgbsq38v8vjg6bw0000gp/T/ipykernel_6972/3630087309.py in get_sent_score()
163
+ /var/folders/jc/q646bg4n6sgbsq38v8vjg6bw0000gp/T/ipykernel_6972/1195801929.py in get_sent_score()
160
164
 
161
- 3 for doc in df["レビュー文"]:
165
+ 8 sent_score += temp_dict["tfidf"]
162
166
 
163
- 4 sent_score = 0
167
+ 9 tfidf_mean=average(sent_score)
164
168
 
165
- ----> 5 for i in range(0,len(word_info)):
169
+ ---> 10 temp = {"ID":eval(doc["doc_id"]),"TFIDF_mean":tfidf_mean}
166
170
 
167
- 6 sent_score = word_info[i]
171
+ 11 sentence_info.append(temp)
168
172
 
169
- 7 if df["レビューID"] == TFIDF_scores["ID"]:
173
+ 12
170
174
 
171
175
 
172
176
 
173
- NameError: name 'word_info' is not defined
177
+ TypeError: string indices must be integers
178
+
179
+ ```
174
180
 
175
181
 
176
182
 
183
+
184
+
177
- Python3.10
185
+ ### 追記
186
+
187
+ 先ほどの質問について説明が不足しておりご不便をおかけいたしました。関数のエラーについては解決できたのですが、次は別のエラーで苦労しています。有識者の方、ぜひ回答いただければと思います。