質問編集履歴
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
|
-
|
3
|
+
レビューデータのtfidfを使って情報量の多いレビューの抽出を行なっています。
|
4
4
|
手順としては
|
5
|
-
0.
|
5
|
+
0. mecabを使ったレビュー文の形態素解析
|
6
6
|
0. ストップワードや品詞の指定による単語の取捨選択
|
7
7
|
0. scikit-learnを使った2の単語(名詞・一般)のtfidf算出
|
8
|
-
0. 各レビューの
|
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
|
-
|
62
|
+
temp_dict = TFIDF_scores[i]
|
62
|
-
if
|
63
|
+
if doc["doc_id"] == temp_dict["ID"]:
|
63
|
-
sent_score +=
|
64
|
+
sent_score += temp_dict["tfidf"]
|
65
|
+
tfidf_mean=average(sent_score)
|
64
|
-
temp = {"ID":
|
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
|
-
|
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/
|
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
|
-
|
83
|
+
8 sent_score += temp_dict["tfidf"]
|
84
|
+
9 tfidf_mean=average(sent_score)
|
85
|
-
|
85
|
+
---> 10 temp = {"ID":eval(doc["doc_id"]),"TFIDF_mean":tfidf_mean}
|
86
|
+
11 sentence_info.append(temp)
|
87
|
+
12
|
86
88
|
|
87
|
-
|
89
|
+
TypeError: string indices must be integers
|
90
|
+
```
|
88
91
|
|
92
|
+
|
89
|
-
|
93
|
+
### 追記
|
94
|
+
先ほどの質問について説明が不足しておりご不便をおかけいたしました。関数のエラーについては解決できたのですが、次は別のエラーで苦労しています。有識者の方、ぜひ回答いただければと思います。
|