質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

644閲覧

形態素解析の結果の一部のみを抽出するコードに関して

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2018/07/21 06:24

前提・実現したいこと

Mecabで形態素解析をしたあと、名詞・形容詞・動詞に該当する単語のみを抽出しようとしています。teratailにあった質問の回答に載っていたコードを参考にしています。

発生している問題・エラーメッセージ

以下のコードを実行すると、抽出したい品詞以外の記号なども出力されてしまうのですが、
記号を含まないようにするには、どのようにコードを修正すべきでしょうか。
全ての記号を制御で網羅することは難しいと思いますが、できる限り記号を排除して、
抽出したい品詞だけを抽出したいです。

記号などを含んでいた入力の場合の出力結果

['日本', '/', '東京'] ['日本', '-', '東京'] ['日本', '&', '東京']

該当のソースコード

python

1import MeCab 2 3def extractKeyword(text): 4 tagger = MeCab.Tagger('-Ochasen') 5 tagger.parse('') 6 node = tagger.parseToNode(text) 7 keywords = [] 8 while node: 9 if node.feature.split(",")[0] == u"名詞": 10 keywords.append(node.surface) 11 elif node.feature.split(",")[0] == u"形容詞": 12 keywords.append(node.surface) 13 elif node.feature.split(",")[0] == u"動詞": 14 keywords.append(node.surface) 15 node = node.next 16 return keywords 17text = "日本の/東京" 18extractKeyword(text)

補足情報(FW/ツールのバージョンなど)

python3.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MeCabのデフォルト設定(記号がサ変接続(サ行変格活用)の名詞扱い)に起因する問題です。

根本的に対処したければ、このあたりを参考にしてください。コード修正では対処できなくて、辞書の再構築が必要になるので、ちょっと面倒ですけど。

mecabで半角記号が名詞,サ変接続になるのを解決する : nymemo
MeCabさんが記号を「サ変接続」と認識してしまう - BlankTar


コード修正で解消しようと思ったら、サ変接続の名詞はぜんぶ切り捨ててしまうという手があります。この場合、本来のサ変接続の名詞(「苦労する」「愛する」「説明する」等)も捨ててしまうことになりますが、タスクによっては許容できるということも多いでしょう。

追記

回答を書いてから軽く調べて、node.statを見れば、未知語かどうかわかることに気づきました。

python

1import MeCab 2 3def extractKeyword(text): 4 tagger = MeCab.Tagger('-Ochasen') 5 tagger.parse('') 6 node = tagger.parseToNode(text) 7 keywords = [] 8 while node: 9 if node.stat != 0: 10 node = node.next 11 continue 12 if node.feature.split(",")[0] == u"名詞": 13 keywords.append(node.surface) 14 elif node.feature.split(",")[0] == u"形容詞": 15 keywords.append(node.surface) 16 elif node.feature.split(",")[0] == u"動詞": 17 keywords.append(node.surface) 18 node = node.next 19 return keywords 20text = "日本の/東京" 21print(extractKeyword(text)) # => ['日本', '東京'] 22 23

この方法が一番手間がかからないと思います。ただし、「未知語だけど正しく処理されている」という形態素があれば、犠牲になる(結果のリストに含まれなくなる)ことになります。

参考:
スクリプト言語のバインディング

追記2

特徴の第二層とnode.statの両方を見るパターン。これだと犠牲になるものを減らせるはず。

python

1import MeCab 2 3def extractKeyword(text): 4 tagger = MeCab.Tagger('-Ochasen') 5 tagger.parse('') 6 node = tagger.parseToNode(text) 7 keywords = [] 8 while node: 9 if node.feature.split(",")[0] == u"名詞": 10 if node.stat == 0 or node.feature.split(",")[1] != "サ変接続": 11 keywords.append(node.surface) 12 elif node.feature.split(",")[0] == u"形容詞": 13 keywords.append(node.surface) 14 elif node.feature.split(",")[0] == u"動詞": 15 keywords.append(node.surface) 16 node = node.next 17 return keywords 18text = "日本の/東京" 19print(extractKeyword(text))

投稿2018/07/21 06:40

編集2018/07/21 07:09
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umyu

2018/07/21 07:23 編集

>hayataka2049さんへ 回答部分のコードではないのですが、形容詞と動詞判定にin句が使えるかと。
hayataka2049

2018/07/21 19:59

ほしい品詞をsetに入れてinで判定すればよさそうですね
hayataka2049

2018/07/21 19:59

ほしい品詞をsetに入れてinで判定すればよさそうですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問