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

回答編集履歴

3

追記2

2018/07/21 07:09

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -41,4 +41,29 @@
41
41
  この方法が一番手間がかからないと思います。ただし、「未知語だけど正しく処理されている」という形態素があれば、犠牲になる(結果のリストに含まれなくなる)ことになります。
42
42
 
43
43
  参考:
44
- [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)
44
+ [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)
45
+
46
+ ### 追記2
47
+ 特徴の第二層とnode.statの両方を見るパターン。これだと犠牲になるものを減らせるはず。
48
+
49
+ ```python
50
+ import MeCab
51
+
52
+ def extractKeyword(text):
53
+ tagger = MeCab.Tagger('-Ochasen')
54
+ tagger.parse('')
55
+ node = tagger.parseToNode(text)
56
+ keywords = []
57
+ while node:
58
+ if node.feature.split(",")[0] == u"名詞":
59
+ if node.stat == 0 or node.feature.split(",")[1] != "サ変接続":
60
+ keywords.append(node.surface)
61
+ elif node.feature.split(",")[0] == u"形容詞":
62
+ keywords.append(node.surface)
63
+ elif node.feature.split(",")[0] == u"動詞":
64
+ keywords.append(node.surface)
65
+ node = node.next
66
+ return keywords
67
+ text = "日本の/東京"
68
+ print(extractKeyword(text))
69
+ ```

2

追記

2018/07/21 07:09

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -37,6 +37,8 @@
37
37
 
38
38
 
39
39
  ```
40
+
41
+ この方法が一番手間がかからないと思います。ただし、「未知語だけど正しく処理されている」という形態素があれば、犠牲になる(結果のリストに含まれなくなる)ことになります。
42
+
40
43
  参考:
41
-
42
44
  [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)

1

追記

2018/07/21 06:50

投稿

hayataka2049
hayataka2049

スコア30939

answer CHANGED
@@ -7,4 +7,36 @@
7
7
 
8
8
  ---
9
9
 
10
- コード修正で解消しようと思ったら、サ変接続の名詞はぜんぶ切り捨ててしまうという手があります。この場合、本来のサ変接続の名詞(「苦労する」「愛する」「説明する」等)も捨ててしまうことになりますが、タスクによっては許容できるということも多いでしょう。
10
+ コード修正で解消しようと思ったら、サ変接続の名詞はぜんぶ切り捨ててしまうという手があります。この場合、本来のサ変接続の名詞(「苦労する」「愛する」「説明する」等)も捨ててしまうことになりますが、タスクによっては許容できるということも多いでしょう。
11
+
12
+ ### 追記
13
+ 回答を書いてから軽く調べて、`node.stat`を見れば、未知語かどうかわかることに気づきました。
14
+
15
+ ```python
16
+ import MeCab
17
+
18
+ def extractKeyword(text):
19
+ tagger = MeCab.Tagger('-Ochasen')
20
+ tagger.parse('')
21
+ node = tagger.parseToNode(text)
22
+ keywords = []
23
+ while node:
24
+ if node.stat != 0:
25
+ node = node.next
26
+ continue
27
+ if node.feature.split(",")[0] == u"名詞":
28
+ keywords.append(node.surface)
29
+ elif node.feature.split(",")[0] == u"形容詞":
30
+ keywords.append(node.surface)
31
+ elif node.feature.split(",")[0] == u"動詞":
32
+ keywords.append(node.surface)
33
+ node = node.next
34
+ return keywords
35
+ text = "日本の/東京"
36
+ print(extractKeyword(text)) # => ['日本', '東京']
37
+
38
+
39
+ ```
40
+ 参考:
41
+
42
+ [スクリプト言語のバインディング](https://taku910.github.io/mecab/bindings.html)