回答編集履歴

3

追記2

2018/07/21 07:09

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -85,3 +85,53 @@
85
85
  参考:
86
86
 
87
87
  [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)
88
+
89
+
90
+
91
+ ### 追記2
92
+
93
+ 特徴の第二層とnode.statの両方を見るパターン。これだと犠牲になるものを減らせるはず。
94
+
95
+
96
+
97
+ ```python
98
+
99
+ import MeCab
100
+
101
+
102
+
103
+ def extractKeyword(text):
104
+
105
+ tagger = MeCab.Tagger('-Ochasen')
106
+
107
+ tagger.parse('')
108
+
109
+ node = tagger.parseToNode(text)
110
+
111
+ keywords = []
112
+
113
+ while node:
114
+
115
+ if node.feature.split(",")[0] == u"名詞":
116
+
117
+ if node.stat == 0 or node.feature.split(",")[1] != "サ変接続":
118
+
119
+ keywords.append(node.surface)
120
+
121
+ elif node.feature.split(",")[0] == u"形容詞":
122
+
123
+ keywords.append(node.surface)
124
+
125
+ elif node.feature.split(",")[0] == u"動詞":
126
+
127
+ keywords.append(node.surface)
128
+
129
+ node = node.next
130
+
131
+ return keywords
132
+
133
+ text = "日本の/東京"
134
+
135
+ print(extractKeyword(text))
136
+
137
+ ```

2

追記

2018/07/21 07:09

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -76,8 +76,12 @@
76
76
 
77
77
  ```
78
78
 
79
+
80
+
79
- 参考:
81
+ この方法が一番手間がかからないと思います。ただし、「未知語だけど正しく処理されている」という形態素があれば、犠牲になる(結果のリストに含まれなくなる)ことになります。
80
82
 
81
83
 
82
84
 
85
+ 参考:
86
+
83
87
  [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)

1

追記

2018/07/21 06:50

投稿

hayataka2049
hayataka2049

スコア30933

test CHANGED
@@ -17,3 +17,67 @@
17
17
 
18
18
 
19
19
  コード修正で解消しようと思ったら、サ変接続の名詞はぜんぶ切り捨ててしまうという手があります。この場合、本来のサ変接続の名詞(「苦労する」「愛する」「説明する」等)も捨ててしまうことになりますが、タスクによっては許容できるということも多いでしょう。
20
+
21
+
22
+
23
+ ### 追記
24
+
25
+ 回答を書いてから軽く調べて、`node.stat`を見れば、未知語かどうかわかることに気づきました。
26
+
27
+
28
+
29
+ ```python
30
+
31
+ import MeCab
32
+
33
+
34
+
35
+ def extractKeyword(text):
36
+
37
+ tagger = MeCab.Tagger('-Ochasen')
38
+
39
+ tagger.parse('')
40
+
41
+ node = tagger.parseToNode(text)
42
+
43
+ keywords = []
44
+
45
+ while node:
46
+
47
+ if node.stat != 0:
48
+
49
+ node = node.next
50
+
51
+ continue
52
+
53
+ if node.feature.split(",")[0] == u"名詞":
54
+
55
+ keywords.append(node.surface)
56
+
57
+ elif node.feature.split(",")[0] == u"形容詞":
58
+
59
+ keywords.append(node.surface)
60
+
61
+ elif node.feature.split(",")[0] == u"動詞":
62
+
63
+ keywords.append(node.surface)
64
+
65
+ node = node.next
66
+
67
+ return keywords
68
+
69
+ text = "日本の/東京"
70
+
71
+ print(extractKeyword(text)) # => ['日本', '東京']
72
+
73
+
74
+
75
+
76
+
77
+ ```
78
+
79
+ 参考:
80
+
81
+
82
+
83
+ [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)