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

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

新規登録して質問してみよう
ただいま回答率
85.48%
関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Mecab

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

Python

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

Q&A

解決済

2回答

1603閲覧

[Python] 関数について ※(MeCab)を利用してます

SmaSTATION

総合スコア29

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Mecab

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

Python

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

0グッド

0クリップ

投稿2021/10/20 00:30

編集2021/10/26 07:53
import MeCab mecab=MeCab.Tagger() import re def mecabparse(sentence): mecab_result=mecab.parse(sentence) # 形態素解析の実行 mecab_result=mecab_result.rstrip() # 最後の改行の削除 out=re.split('\n',mecab_result) # 改行で分割して1形態素毎のリストにする return(out) def sentence2words(sentence): words=[] morphs=mecabparse(sentence) for m in morphs: line=re.split('\t',m) for i in range(len(line)): print(i,line[i]) line1=re.split("\t",line[0]) words.append(line[0]) return (" ".join(words)) test="軽かった" sentence2words(test)

質問、修正させていただきました。

上のMecabと関数を使って、最後部分の表示を「軽い」「た」というように表示するプログラムを書けなくて困っております。

今の出力結果がこちらです。

0

11 形容詞,自立,*,*,形容詞・アウオ段,連用タ接続,軽い,カルカッ,カルカッ 20 た 31 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 40 EOS 5軽かっ た EOS

今は、関数sentence2wordsのlineごとに表示をしてみています。
具体的には、この

1 形容詞,自立,,,形容詞・アウオ段,連用タ接続,軽い,カルカッ,カルカッ

部分の8個目にある「軽い」を取り出すという処理です。
※8番目に原型が来るのは確実です。

お手数をおかけしますが、よろしくお願いします。

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

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

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

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

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

can110

2021/10/20 01:52

その関数を作るにあたって、何が分からないのかを具体的(~までは分かるが~が分からない)に示してください。 なお、質問の仕方については以下に示されています。これを読んだうえで質問に不足などあれば質問本文を修正ください。 https://teratail.com/help/question-tips
quickquip

2021/10/20 04:30 編集

mecabの辞書が異なると書くべきコードが変わります。質問者さんの手元の環境が不明である以上「こうするとできます」という回答ができない質問です。 line=re.split('\t',m) としてますが、ここでsplitせずにmがどういう文字列が入っているのかを、もしくはsplitしたあとのlineがどういうリストかを観察してみるとよいと思います。(ここでsplitを書けるのですから、何も分からないということは決してないはずです) その上でうまくいかなかったら、どううまくいかなかったかを挙げて質問する方がよいです。
SmaSTATION

2021/10/20 08:54

お二方、ありがとうございます。もう少し粘ってみます。
guest

回答2

0

ベストアンサー

# 関数を使わなくても、mecab.parseだけで形態素解析できます import re import MeCab mecab = MeCab.Tagger () m_data = mecab.parse("軽かった") #形態素解析 print(m_data)
line=re.split('\n',m_data) #解析結果を改行記号\nで単語単位に分割 line[0] #1行目を表示
word = line[0].split(",") #1行目をカンマ,で分割 word
word[6] #7番目の要素を出力(1番目と2番めはカンマではなく、タブで区切られているため)

line=re.split('\n',m_data) 以降は

re.split('\n',m_data)[0].split(",")[6]

とまとめることも出来ます。

投稿2021/11/06 00:40

編集2021/11/06 22:31
coffeebar

総合スコア140

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

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

0

printした結果から、各字句は分割された字句<タブ文字>各種データという構成であり
各種データ,区切りで構成されていることが分かるかと思います。
よってline=re.split('\t',m)の2番目の要素line[1],でsplitして、目的の位置の要素(文字列)を得ればよいです。
ただしEOSなど、字句によっては各種データ部分がない場合があることに注意してください。(len(line)が1の場合がある)

投稿2021/10/26 08:08

can110

総合スコア38262

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

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

SmaSTATION

2021/10/31 08:27

line=re.split('\t',m)の2番目の要素line[1]を,でsplit 上記の文をプログラムにすると、line1=re.split(",",line[1]) でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問