質問編集履歴
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
|
-
|
5
|
+
レビューデータのtfidfを使って情報量の多いレビューの抽出を行なっています。
|
6
6
|
|
7
7
|
手順としては
|
8
8
|
|
9
|
-
0.
|
9
|
+
0. mecabを使ったレビュー文の形態素解析
|
10
10
|
|
11
11
|
0. ストップワードや品詞の指定による単語の取捨選択
|
12
12
|
|
13
13
|
0. scikit-learnを使った2の単語(名詞・一般)のtfidf算出
|
14
14
|
|
15
|
-
0. 各レビューの
|
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
|
-
|
123
|
+
temp_dict = TFIDF_scores[i]
|
122
124
|
|
123
|
-
if d
|
125
|
+
if doc["doc_id"] == temp_dict["ID"]:
|
124
126
|
|
125
|
-
sent_score +=
|
127
|
+
sent_score += temp_dict["tfidf"]
|
126
128
|
|
127
|
-
|
129
|
+
tfidf_mean=average(sent_score)
|
128
130
|
|
129
|
-
|
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
|
-
|
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/
|
163
|
+
/var/folders/jc/q646bg4n6sgbsq38v8vjg6bw0000gp/T/ipykernel_6972/1195801929.py in get_sent_score()
|
160
164
|
|
161
|
-
|
165
|
+
8 sent_score += temp_dict["tfidf"]
|
162
166
|
|
163
|
-
|
167
|
+
9 tfidf_mean=average(sent_score)
|
164
168
|
|
165
|
-
---
|
169
|
+
---> 10 temp = {"ID":eval(doc["doc_id"]),"TFIDF_mean":tfidf_mean}
|
166
170
|
|
167
|
-
|
171
|
+
11 sentence_info.append(temp)
|
168
172
|
|
169
|
-
|
173
|
+
12
|
170
174
|
|
171
175
|
|
172
176
|
|
173
|
-
|
177
|
+
TypeError: string indices must be integers
|
178
|
+
|
179
|
+
```
|
174
180
|
|
175
181
|
|
176
182
|
|
183
|
+
|
184
|
+
|
177
|
-
|
185
|
+
### 追記
|
186
|
+
|
187
|
+
先ほどの質問について説明が不足しておりご不便をおかけいたしました。関数のエラーについては解決できたのですが、次は別のエラーで苦労しています。有識者の方、ぜひ回答いただければと思います。
|