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

質問編集履歴

2

誤字修正

2023/09/22 23:18

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,137 +1,45 @@
1
- ### 前提・実現したいこと
2
- PythonでTF-IDFを用いた重み付けを行おうとしています。
3
- 実現したいことは、[前回の質問](https://teratail.com/questions/144609)と同じで、
4
- ```
5
- カ・コラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱」場合には「お茶」
6
- 「Clover カットワークはさみ 115 サック付き 36-666」の場合には「はさみ」
7
- ```
8
- というようにECサイトの商品タイトルから商品を最もよく表す一般名詞を抽出したいと考えています。
9
-
10
- ### 発生している問題・エラーメッセージ
11
- もとのコードがpython2系だったので、3系に直す部分print()などを加えて実行したところ、以下のエラーが出ました。修正方法がわからず、困っています。
12
- また、もしよりわかりやすい入門のTF-IDFを用いた重み付けのコードがあれば教えていただきたいです。
13
-
14
- もとのコードは[参考ページ](http://kitsunemimi9.blog89.fc2.com/blog-entry-20.html)に記載されているコードです。
15
- ```python
16
- $ python tfidf.py
17
- total texts: 5
18
- Traceback (most recent call last):
19
- File "tfidf.py", line 26, in <module>
20
- node = tagger.parseToNode(txt.encode('utf-8'))
21
- File "/Users/username/anaconda/lib/python3.6/site-packages/MeCab.py", line 282, in parseToNode
22
- def parseToNode(self, *args): return _MeCab.Tagger_parseToNode(self, *args)
23
- TypeError: in method 'Tagger_parseToNode', argument 2 of type 'char const *'
24
- ```
25
-
26
- ### 該当のソースコード
27
- tfidf.py
28
- ```Python
29
- # -*- coding: utf-8 -*-
30
-
31
- import MeCab # 形態素解析器MeCab
32
-
33
- import math
34
-
35
- # 文書集合サンプル
36
- 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日 – この用法の「壁ドン(壁にドン)」は声優の新谷良子の発言から広まったものであり、一般的には「壁際」+「追い詰」「押し付け」などと表現される場合が多い。 ドンッ. 「……黙れよ」. こように、命令口調で強引に迫られるのが女性のロマンの"]
37
-
38
- txt_num = len(text)
39
- print ('total texts:', txt_num)
40
- #print
41
-
42
- fv_tf = [] # ある文書中の単語の出現回数を格納するための配列
43
- fv_df = {} # 単語の出現文書数を格納するためのディクショナリ
44
- word_count = [] # 単語総出現回数を格納するための配列
45
-
46
- fv_tf_idf = [] # ある文書中の単語の特徴量を格納するための配列
47
-
48
- count_flag = {} # fv_dfを計算する上で必要なフラグを格納するためのディクショナリ
49
-
50
- # 各文書の形態素解析と、単語の出現回数の計算
51
- for txt_id, txt in enumerate(text):
52
- # MeCabを使うための初期化
53
- tagger = MeCab.Tagger()
54
- node = tagger.parseToNode(txt.encode('utf-8'))
55
-
56
- fv = {} # 単語の出現回数を格納するためのディクショナリ
57
- words = 0 # ある文書の単語の総出現回数
58
-
59
- for word in fv_df.keys():
60
- count_flag[word] = False
61
- while node.next:
62
- node = node.next
63
- surface = node.surface.decode('utf-8') # 形態素解析により得られた単語
64
-
65
- words += 1
66
-
67
- fv[surface] = fv.get(surface, 0) + 1 # fvにキー値がsurfaceの要素があれば、それに1を加え、なければ新しくキー値がsurfaceの要素をディクショナリに加え、値を1にする
68
-
69
- if surface in fv_df.keys(): # fv_dfにキー値がsurfaceの要素があれば
70
- if count_flag[surface] == False: # フラグを確認し,Falseであれば
71
- fv_df[surface] += 1 # 出現文書数を1増やす
72
- count_flag[surface] = True # フラグをTrueにする
73
- else: # fv_dfにキー値がsurfaceの要素がなければ
74
- fv_df[surface] = 1 # 新たにキー値がsurfaceの要素を作り,値として1を代入する
75
- count_flag[surface] = True # フラグをTrueにする
76
-
77
- fv_tf.append(fv)
78
- word_count.append(words)
79
-
80
- # tf, idf, tf-idfなどの計算
81
- for txt_id, fv in enumerate(fv_tf):
82
- tf = {}
83
- idf = {}
84
- tf_idf = {}
85
- for key in fv.keys():
86
- tf[key] = float(fv[key]) / word_count[txt_id] # tfの計算
87
- idf[key] = math.log(float(txt_num) / fv_df[key]) # idfの計算
88
- tf_idf[key] = (tf[key] * idf[key], tf[key], idf[key], fv[key], fv_df[key]) # tf-idfその他の計算
89
- tf_idf = sorted(tf_idf.items(), key=lambda x:x[1][0], reverse=True) # 得られたディクショナリtf-idfを、tf[key]*idf[key](tf-idf値)で降順ソート(処理後にはtf-idfはリストオブジェクトになっている)
90
- fv_tf_idf.append(tf_idf)
91
-
92
- # 出力
93
- for txt_id, fv in enumerate(fv_tf_idf):
94
- print ('This is the tf-idf of text', txt_id)
95
- print ('total words:', word_count[txt_id])
96
- #print
97
-
98
- for word, tf_idf in fv:
99
- 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値、その文書中の単語の出現回数、その単語の出現文書数(これは単語ごとに同じ値をとる)
100
- #print
101
- ```
102
-
103
- ### ご回答を受けてやってみたこと
104
- [TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる | コード7区](http://ailaby.com/tfidf/)の「使ってみる」にあった、コードの#文書1、2、3の部分に以下の入力を代入して出力してみました。
105
-
106
- 入力
107
- ```
108
- 'コカ・コーラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱'
109
- 'Clover カットワークはさみ 115 サック付き 36-666'
110
- '森永乳業 マウントレーニア カフェラッテ 240ml×10'
111
- ```
112
- 出力結果
113
- ```
114
- 10本
115
- 115
116
- 240ml
117
- 2l
118
- 2箱
119
- 36
120
- 666
121
- 6本
122
- clover
123
- お茶
124
- カットワークはさみ
125
- カフェラッテ
126
- コカ
127
- コーラ
128
- サック付き
129
- ペットボトル
130
- マウントレーニア
131
- 森永乳業
132
- 綾鷹
133
- ```
134
-
135
-
136
- ### 補足情報(FW/ツールのバージョンなど)
1
+ ### 前提・実現したいこと
2
+ PythonでTF-IDFを用いた重み付けを行おうとしています。
3
+
4
+ ### 発生している問題・エラーメッセージ
5
+ もとのコードがpython2系だったので、3系に直す部分print()などを加えて実行したところ、以下エラーが出ました。修正方法がわからず、困っています。
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 *'
17
+ ```
18
+
19
+ ### 該当のソースコード
20
+ tfidf.py
21
+ ```Python
22
+ # -*- coding: utf-8 -*-
23
+
24
+ import MeCab # 形態素解析器MeCab
25
+
26
+ import math
27
+
28
+ # 文書集合のサンプル
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日 – この用法の「壁ドン(壁にドン)」は声優の新谷良子の発言から広まったものであり、一般的には「壁際」+「追い詰め」「押し付け」などと表現される場合が多い。 ドンッ. 「……黙れよ」. このように、命令口調で強引に迫られるのが女性のロマンの"]
30
+
31
+ txt_num = len(text)
32
+ print ('total texts:', txt_num)
33
+ #print
34
+
35
+ fv_tf = [] # ある文書単語の出現回数を格納するための配列
36
+ fv_df = {} # 単語の出現文数を格納ためのディクショナリ
37
+ word_count = [] # 単語の総出現回数を格納するための配列
38
+
39
+ fv_tf_idf = [] # ある文書中の単語の特徴量を格納するための配列
40
+
41
+ count_flag = {} # fv_dfを計算する上で必要なフラグを格納するためのディクショナリ
42
+ ```
43
+
44
+ ### 補足情報(FW/ツールバージョンなど)
137
45
  Python 3.6.0 :: Anaconda 4.3.0

1

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

2018/09/05 12:54

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -100,6 +100,38 @@
100
100
  #print
101
101
  ```
102
102
 
103
+ ### ご回答を受けてやってみたこと
104
+ [TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる | コード7区](http://ailaby.com/tfidf/)の「使ってみる」にあった、コードの#文書1、2、3の部分に以下の入力を代入して出力してみました。
103
105
 
106
+ 入力
107
+ ```
108
+ 'コカ・コーラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱'
109
+ 'Clover カットワークはさみ 115 サック付き 36-666'
110
+ '森永乳業 マウントレーニア カフェラッテ 240ml×10'
111
+ ```
112
+ 出力結果
113
+ ```
114
+ 10本
115
+ 115
116
+ 240ml
117
+ 2l
118
+ 2箱
119
+ 36
120
+ 666
121
+ 6本
122
+ clover
123
+ お茶
124
+ カットワークはさみ
125
+ カフェラッテ
126
+ コカ
127
+ コーラ
128
+ サック付き
129
+ ペットボトル
130
+ マウントレーニア
131
+ 森永乳業
132
+ 綾鷹
133
+ ```
134
+
135
+
104
136
  ### 補足情報(FW/ツールのバージョンなど)
105
137
  Python 3.6.0 :: Anaconda 4.3.0