質問編集履歴

2

誤字修正

2023/09/22 23:18

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,273 +1,45 @@
1
1
  ### 前提・実現したいこと
2
-
3
2
  PythonでTF-IDFを用いた重み付けを行おうとしています。
4
3
 
4
+ ### 発生している問題・エラーメッセージ
5
- 実現したいこは、[前回質問](https://teratail.com/questions/144609)と同じで
5
+ とのコードがpython2系だったので、3系に直す部分print()などを加えて実行したころ以下のエラーが出ました。修正方法がわからず、困っています。
6
6
 
7
+ もとのコードは[参考ページ](http://kitsunemimi9.blog89.fc2.com/blog-entry-20.html)に記載されているコードです。
8
+ ```python
9
+ $ python tfidf.py
10
+ total texts: 5
11
+ Traceback (most recent call last):
12
+ File "tfidf.py", line 26, in <module>
13
+ node = tagger.parseToNode(txt.encode('utf-8'))
14
+ File "/Users/username/anaconda/lib/python3.6/site-packages/MeCab.py", line 282, in parseToNode
15
+ def parseToNode(self, *args): return _MeCab.Tagger_parseToNode(self, *args)
16
+ TypeError: in method 'Tagger_parseToNode', argument 2 of type 'char const *'
7
17
  ```
8
18
 
9
- 「コカ・コーラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱」の場合には「お茶」
10
-
11
- 「Clover カットワークはさみ 115 サック付き 36-666」の場合には「はさみ」
12
-
13
- ```
14
-
15
- というようにECサイトの商品タイトルから商品を最もよく表す一般名詞を抽出したいと考えています。
16
-
17
-
18
-
19
- ### 発生している問題・エラーメッセージ
20
-
21
- もとのコードがpython2系だったので、3系に直す部分print()などを加えて実行したところ、以下のエラーが出ました。修正方法がわからず、困っています。
22
-
23
- また、もしよりわかりやすい入門のTF-IDFを用いた重み付けのコードがあれば教えていただきたいです。
24
-
25
-
26
-
27
- もとのコードは[参考ページ](http://kitsunemimi9.blog89.fc2.com/blog-entry-20.html)に記載されているコードです。
28
-
29
- ```python
30
-
31
- $ python tfidf.py
32
-
33
- total texts: 5
34
-
35
- Traceback (most recent call last):
36
-
37
- File "tfidf.py", line 26, in <module>
38
-
39
- node = tagger.parseToNode(txt.encode('utf-8'))
40
-
41
- File "/Users/username/anaconda/lib/python3.6/site-packages/MeCab.py", line 282, in parseToNode
42
-
43
- def parseToNode(self, *args): return _MeCab.Tagger_parseToNode(self, *args)
44
-
45
- TypeError: in method 'Tagger_parseToNode', argument 2 of type 'char const *'
46
-
47
- ```
48
-
49
-
50
-
51
19
  ### 該当のソースコード
52
-
53
20
  tfidf.py
54
-
55
21
  ```Python
56
-
57
22
  # -*- coding: utf-8 -*-
58
-
59
23
 
60
-
61
24
  import MeCab # 形態素解析器MeCab
62
-
63
25
 
64
-
65
26
  import math
66
-
67
27
 
68
-
69
28
  # 文書集合のサンプル
70
-
71
29
  text = ["ミニアルバム☆ 新谷良子withPBB「BANDScore」 絶賛発売chu♪ いつもと違い、「新谷良子withPBB」名義でのリリース!! 全5曲で全曲新録!とてもとても濃い1枚になりましたっ。 PBBメンバーと作り上げた、新たなバンビポップ。 今回も、こだわり抜いて", "2012年11月24日 – 2012年11月24日(土)/12:30に行われる、新谷良子が出演するイベント詳細情報です。", "単語記事: 新谷良子. 編集 Tweet. 概要; 人物像; 主な ... その『ミルフィーユ・桜葉』という役は新谷良子の名前を広く認知させ、本人にも大切なものとなっている。 このころは演技も歌も素人丸出し( ... え、普通のことしか書いてないって? 「普通って言うなぁ!」", "2009年10月20日 – 普通におっぱいが大きい新谷良子さん』 ... 新谷良子オフィシャルblog 「はぴすま☆だいありー♪」 Powered by Ameba ... 結婚 356 名前: ノイズh(神奈川県)[sage] 投稿日:2009/10/19(月) 22:04:20.17 ID:7/ms/OLl できたっちゃ結婚か", "2010年5月30日 – この用法の「壁ドン(壁にドン)」は声優の新谷良子の発言から広まったものであり、一般的には「壁際」+「追い詰め」「押し付け」などと表現される場合が多い。 ドンッ. 「……黙れよ」. このように、命令口調で強引に迫られるのが女性のロマンの"]
72
-
73
30
 
74
-
75
31
  txt_num = len(text)
76
-
77
32
  print ('total texts:', txt_num)
78
-
79
33
  #print
80
-
81
34
 
82
-
83
35
  fv_tf = [] # ある文書中の単語の出現回数を格納するための配列
84
-
85
36
  fv_df = {} # 単語の出現文書数を格納するためのディクショナリ
86
-
87
37
  word_count = [] # 単語の総出現回数を格納するための配列
88
-
89
38
 
90
-
91
39
  fv_tf_idf = [] # ある文書中の単語の特徴量を格納するための配列
92
-
93
40
 
94
-
95
41
  count_flag = {} # fv_dfを計算する上で必要なフラグを格納するためのディクショナリ
96
-
97
-
98
-
99
- # 各文書の形態素解析と、単語の出現回数の計算
100
-
101
- for txt_id, txt in enumerate(text):
102
-
103
- # MeCabを使うための初期化
104
-
105
- tagger = MeCab.Tagger()
106
-
107
- node = tagger.parseToNode(txt.encode('utf-8'))
108
-
109
-
110
-
111
- fv = {} # 単語の出現回数を格納するためのディクショナリ
112
-
113
- words = 0 # ある文書の単語の総出現回数
114
-
115
-
116
-
117
- for word in fv_df.keys():
118
-
119
- count_flag[word] = False
120
-
121
- while node.next:
122
-
123
- node = node.next
124
-
125
- surface = node.surface.decode('utf-8') # 形態素解析により得られた単語
126
-
127
-
128
-
129
- words += 1
130
-
131
-
132
-
133
- fv[surface] = fv.get(surface, 0) + 1 # fvにキー値がsurfaceの要素があれば、それに1を加え、なければ新しくキー値がsurfaceの要素をディクショナリに加え、値を1にする
134
-
135
-
136
-
137
- if surface in fv_df.keys(): # fv_dfにキー値がsurfaceの要素があれば
138
-
139
- if count_flag[surface] == False: # フラグを確認し,Falseであれば
140
-
141
- fv_df[surface] += 1 # 出現文書数を1増やす
142
-
143
- count_flag[surface] = True # フラグをTrueにする
144
-
145
- else: # fv_dfにキー値がsurfaceの要素がなければ
146
-
147
- fv_df[surface] = 1 # 新たにキー値がsurfaceの要素を作り,値として1を代入する
148
-
149
- count_flag[surface] = True # フラグをTrueにする
150
-
151
-
152
-
153
- fv_tf.append(fv)
154
-
155
- word_count.append(words)
156
-
157
-
158
-
159
- # tf, idf, tf-idfなどの計算
160
-
161
- for txt_id, fv in enumerate(fv_tf):
162
-
163
- tf = {}
164
-
165
- idf = {}
166
-
167
- tf_idf = {}
168
-
169
- for key in fv.keys():
170
-
171
- tf[key] = float(fv[key]) / word_count[txt_id] # tfの計算
172
-
173
- idf[key] = math.log(float(txt_num) / fv_df[key]) # idfの計算
174
-
175
- tf_idf[key] = (tf[key] * idf[key], tf[key], idf[key], fv[key], fv_df[key]) # tf-idfその他の計算
176
-
177
- tf_idf = sorted(tf_idf.items(), key=lambda x:x[1][0], reverse=True) # 得られたディクショナリtf-idfを、tf[key]*idf[key](tf-idf値)で降順ソート(処理後にはtf-idfはリストオブジェクトになっている)
178
-
179
- fv_tf_idf.append(tf_idf)
180
-
181
-
182
-
183
- # 出力
184
-
185
- for txt_id, fv in enumerate(fv_tf_idf):
186
-
187
- print ('This is the tf-idf of text', txt_id)
188
-
189
- print ('total words:', word_count[txt_id])
190
-
191
- #print
192
-
193
-
194
-
195
- for word, tf_idf in fv:
196
-
197
- print ('%s\ttf-idf:%lf\ttf:%lf\tidf:%lf\tterm_count:%d\tdocument_count:%d' % (word, tf_idf[0], tf_idf[1], tf_idf[2], tf_idf[3], tf_idf[4]) )# 左から順に、単語、tf-idf値、tf値、idf値、その文書中の単語の出現回数、その単語の出現文書数(これは単語ごとに同じ値をとる)
198
-
199
- #print
200
-
201
- ```
202
-
203
-
204
-
205
- ### ご回答を受けてやってみたこと
206
-
207
- [TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる | コード7区](http://ailaby.com/tfidf/)の「使ってみる」にあった、コードの#文書1、2、3の部分に以下の入力を代入して出力してみました。
208
-
209
-
210
-
211
- 入力
212
-
213
- ```
214
-
215
- 'コカ・コーラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱'
216
-
217
- 'Clover カットワークはさみ 115 サック付き 36-666'
218
-
219
- '森永乳業 マウントレーニア カフェラッテ 240ml×10'
220
-
221
- ```
222
-
223
- 出力結果
224
-
225
- ```
226
-
227
- 10本
228
-
229
- 115
230
-
231
- 240ml
232
-
233
- 2l
234
-
235
- 2箱
236
-
237
- 36
238
-
239
- 666
240
-
241
- 6本
242
-
243
- clover
244
-
245
- お茶
246
-
247
- カットワークはさみ
248
-
249
- カフェラッテ
250
-
251
- コカ
252
-
253
- コーラ
254
-
255
- サック付き
256
-
257
- ペットボトル
258
-
259
- マウントレーニア
260
-
261
- 森永乳業
262
-
263
- 綾鷹
264
-
265
- ```
266
-
267
-
268
-
269
-
42
+ ```
270
43
 
271
44
  ### 補足情報(FW/ツールのバージョンなど)
272
-
273
45
  Python 3.6.0 :: Anaconda 4.3.0

1

ご回答を受けてやってみたことの追記

2018/09/05 12:54

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -202,6 +202,70 @@
202
202
 
203
203
 
204
204
 
205
+ ### ご回答を受けてやってみたこと
206
+
207
+ [TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる | コード7区](http://ailaby.com/tfidf/)の「使ってみる」にあった、コードの#文書1、2、3の部分に以下の入力を代入して出力してみました。
208
+
209
+
210
+
211
+ 入力
212
+
213
+ ```
214
+
215
+ 'コカ・コーラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱'
216
+
217
+ 'Clover カットワークはさみ 115 サック付き 36-666'
218
+
219
+ '森永乳業 マウントレーニア カフェラッテ 240ml×10'
220
+
221
+ ```
222
+
223
+ 出力結果
224
+
225
+ ```
226
+
227
+ 10本
228
+
229
+ 115
230
+
231
+ 240ml
232
+
233
+ 2l
234
+
235
+ 2箱
236
+
237
+ 36
238
+
239
+ 666
240
+
241
+ 6本
242
+
243
+ clover
244
+
245
+ お茶
246
+
247
+ カットワークはさみ
248
+
249
+ カフェラッテ
250
+
251
+ コカ
252
+
253
+ コーラ
254
+
255
+ サック付き
256
+
257
+ ペットボトル
258
+
259
+ マウントレーニア
260
+
261
+ 森永乳業
262
+
263
+ 綾鷹
264
+
265
+ ```
266
+
267
+
268
+
205
269
 
206
270
 
207
271
  ### 補足情報(FW/ツールのバージョンなど)