回答編集履歴

2

追記

2018/08/07 07:54

投稿

quickquip
quickquip

スコア11046

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  入力が半角なのがまずいので、適当なコード(Web検索で拾ってくればいいでしょう)で全角にしましょう。
16
16
 
17
- ipadicには半角記号が辞書に含まれてないのです。
17
+ ipadicには半角記号が辞書に含まれてないため、名詞扱いになるのです。
18
18
 
19
19
 
20
20
 

1

追記

2018/08/07 07:54

投稿

quickquip
quickquip

スコア11046

test CHANGED
@@ -5,3 +5,117 @@
5
5
  ```
6
6
 
7
7
  として、**未知語を取り除く**処理をいれて、自分でわざわざ取り除いてますよね。
8
+
9
+
10
+
11
+ ----
12
+
13
+
14
+
15
+ 入力が半角なのがまずいので、適当なコード(Web検索で拾ってくればいいでしょう)で全角にしましょう。
16
+
17
+ ipadicには半角記号が辞書に含まれてないのです。
18
+
19
+
20
+
21
+
22
+
23
+ ```shell
24
+
25
+ % echo "ドライ・アムネシア・バラ(切花)" | mecab
26
+
27
+ ドライ・アムネシア・バラ 名詞,一般,*,*,*,*,*
28
+
29
+ ( 記号,括弧開,*,*,*,*,(,(,(
30
+
31
+ 切花 名詞,一般,*,*,*,*,切花,キリバナ,キリバナ
32
+
33
+ ) 記号,括弧閉,*,*,*,*,),),)
34
+
35
+ EOS
36
+
37
+ % echo "ドライ・アムネシア・バラ(切花)" | mecab
38
+
39
+ ドライ・アムネシア・バラ 名詞,一般,*,*,*,*,*
40
+
41
+ ( 名詞,サ変接続,*,*,*,*,*
42
+
43
+ 切花 名詞,一般,*,*,*,*,切花,キリバナ,キリバナ
44
+
45
+ ) 名詞,サ変接続,*,*,*,*,*
46
+
47
+ EOS
48
+
49
+ ```
50
+
51
+
52
+
53
+ その上で、`node.stat`を見ないで、品詞が名詞のものを拾えばいいかと思います。
54
+
55
+ あと用途によるでしょうが、私ならもうちょっと品詞細目を絞りますね。
56
+
57
+
58
+
59
+ ```Python
60
+
61
+ STOP_POS = {
62
+
63
+ ('名詞', '副詞可能', '*'), # これは微妙?
64
+
65
+ ('名詞', '非自立', '副詞可能'),
66
+
67
+ ('名詞', '非自立', '一般'),
68
+
69
+ ('名詞', '接尾', '副詞可能'),
70
+
71
+ ('名詞', '接尾', '助数詞'),
72
+
73
+ ('名詞', '数', '*'),
74
+
75
+ }
76
+
77
+
78
+
79
+
80
+
81
+ def han2zen(text):
82
+
83
+ # なんかてきとうな全角化関数にしてください
84
+
85
+ return text
86
+
87
+
88
+
89
+
90
+
91
+ def extractKeyword(text):
92
+
93
+ tagger = MeCab.Tagger('-Ochasen')
94
+
95
+ tagger.parse('')
96
+
97
+ node = tagger.parseToNode(han2zen(text))
98
+
99
+ keywords = []
100
+
101
+ while node:
102
+
103
+ features = tuple(node.feature.split(","))
104
+
105
+ if features[0] == u"名詞" and features[:3] not in STOP_POS:
106
+
107
+ keywords.append(node.surface)
108
+
109
+ elif features[0] == u"形容詞" and features[1] == u"自立":
110
+
111
+ keywords.append(node.surface)
112
+
113
+ elif features[0] == u"動詞" and features[1] == u"自立":
114
+
115
+ keywords.append(node.surface)
116
+
117
+ node = node.next
118
+
119
+ return keywords
120
+
121
+ ```