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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Mecab

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

Python

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

Q&A

解決済

1回答

160閲覧

tfidfの処理をさせるためにmecabのリストに入ってるセンテンスから名詞だけ抽出したい場合のコード

sequelanonymous

総合スコア123

Mecab

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

Python

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

0グッド

0クリップ

投稿2019/04/11 10:04

下記のコードのようにOchasenをつかって品詞が名詞のものだけ、取り出したいと思っていますが、どう書いていけばよいのかわからず色々試してみたもののそろそろ詰まってきました。Ochasenを使わなくてもとりあえず、名詞の単語が取り出せればいいと思っています。

なにか、こうかける、こうしたほうがいいなどがありましたら、ご教示頂けると助かります。

path = '/yyy/dddd/xxxx.csv' mecab = MeCab.Tagger("-Ochasen") with open(path, 'r') as f: texts = [line.rstrip('\n').split(',') for line in f] # ループで順番に取得するようにあとでかく line = [line[2] for line in texts] >> texts [['0','url', '日本語日本語日本語'], ['1','url','それは、孔子の教えであり、先生へ向けた言葉でもある'], ['2','url','ほげ高い山にのぼることができた']] >> line ['日本語日本語日本語', 'それは、孔子の教えであり、先生へ向けた言葉でもある', 'ほげ高い山にのぼることができた']

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下のような感じでしょうか。

Python

1import MeCab 2mecab = MeCab.Tagger("-Ochasen") 3for line in ['それは、孔子の教えであり、先生へ向けた言葉でもある']: 4 parse = mecab.parse(line) 5 words = parse.split('\n') 6 import re 7 for word in words: 8 items = re.split('[\t,]',word) 9 print(items) 10 11 if len(items) != 6: # EOSなどは不要 12 continue 13 14 if items[3].startswith('名詞'): # 名詞-一般 など 15 print(items[0]) 16""" 17['それ', 'ソレ', 'それ', '名詞-代名詞-一般', '', ''] 18それ 19['は', 'ハ', 'は', '助詞-係助詞', '', ''] 20['、', '、', '、', '記号-読点', '', ''] 21['孔子の教え', 'コウシノオシエ', '孔子の教え', '名詞-固有名詞-一般', '', ''] 22孔子の教え 23['で', 'デ', 'だ', '助動詞', '特殊・ダ', '連用形'] 24['あり', 'アリ', 'ある', '助動詞', '五段・ラ行アル', '連用形'] 25['、', '、', '、', '記号-読点', '', ''] 26['先生', 'センセイ', '先生', '名詞-一般', '', ''] 27先生 28['へ', 'ヘ', 'へ', '助詞-格助詞-一般', '', ''] 29['向け', 'ムケ', '向ける', '動詞-自立', '一段', '連用形'] 30['た', 'タ', 'た', '助動詞', '特殊・タ', '基本形'] 31['言葉', 'コトバ', '言葉', '名詞-一般', '', ''] 32言葉 33['で', 'デ', 'で', '助詞-格助詞-一般', '', ''] 34['も', 'モ', 'も', '助詞-係助詞', '', ''] 35['ある', 'アル', 'ある', '動詞-自立', '五段・ラ行', '基本形'] 36['EOS'] 37[''] 38"""

投稿2019/04/11 10:42

can110

総合スコア38266

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

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

sequelanonymous

2019/04/11 11:05

コメントありがとうございます。名詞の単語だけとりだしたいです。
can110

2019/04/11 11:09

if items[3].startswith('名詞'): # 名詞-一般 など print(items[0]) の部分で名詞(の単語)を取り出しています。
sequelanonymous

2019/04/12 02:36

上記、上手く名詞だけとれました。ありがとうございます。 ただ、list内包表記で以下のように書き換えて実行してみたのですが、上手くいかず、なにかお気づきの点ありましたら教えて頂けると幸いです。 for l in line: parse = mecab.parse(l) words = parse.split('\n') items = [re.split('[\t,]', word) for word in words] >> [item[3].startswith('名詞') for item in items if item[3].startswith('名詞')] Traceback (most recent call last): File "<input>", line 1, in <module> File "<input>", line 1, in <listcomp> IndexError: list index out of range
can110

2019/04/12 02:46 編集

回答コードでの「EOSなどは不要」処理が抜けているため EOSなどでのitem[3]でリスト範囲外を参照してしまっています。 また、欲しいデータ(リストに格納すべき)はitem[0]なので [item[0] for item in items if len(item) == 6 and item[3].startswith('名詞')] と書けばよいです。
sequelanonymous

2019/04/12 12:04

できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問