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

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

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

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

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

Mecab

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

Python

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

自然言語処理

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

Q&A

解決済

1回答

1896閲覧

MeCabで作った自然言語データから助詞を消したい

Pablito

総合スコア71

Pythonista

Pythonistaは、iOS上でPythonプログラミングができる開発アプリです。さらに、Pythonの関数・変数などを自動で補完する便利なコードエディタや、PythonスクリプトをiOS上で多様な形で機能させる各種機能も内包しています。

Python 3.x

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

Mecab

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

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2021/05/13 05:16

編集2021/05/14 00:42

前提・実現したいこと

Pythonを使ってアンケート内の自然言語データを
可視化したいと考えています。

今回はNlplotを使った可視化を考えていますが、
可視化の前に行う処理でMeCabで作ったデータから助詞を消したいのですが、
上手くいっておらずご相談したく存じます。

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

TypeError Traceback (most recent call last) <ipython-input-10-c6c44e85bce1> in <module> 1 mecab = MeCab.Tagger() ----> 2 parse = mecab.parse(data['wakachi']) 3 4 words = [] 5 lines = parse.split('\n') TypeError: in method 'Tagger_parse', argument 2 of type 'char const *' Additional information: Wrong number or type of arguments for overloaded function 'Tagger_parse'. Possible C/C++ prototypes are: MeCab::Tagger::parse(MeCab::Lattice *) const MeCab::Tagger::parse(char const *)

該当のソースコード

Python

1import pandas as pd 2import nlplot 3 4path = r'C:\Users\データ\LIVE Screening.csv' 5df = pd.read_csv(path, sep=',', encoding='cp932') 6df.head() 7 8***→これの助詞を消したい。 9VOICE 100 字が綺麗になりたいから 111 始めたきっかけは親の影響です。 122 字がきれいになりたいから 133 字が綺麗な友人に憧れて。 144 文字を綺麗に書きたいと思ったので習い始めました。 15*** 16import MeCab 17 18m0 = MeCab.Tagger('-Owakati') 19wakachi_list = [] 20for i, di in enumerate(df['VOICE']): 21 try: 22 w = m0.parse(di) 23 except: 24 w = di 25 26 if 'list' in str(type(w)): 27 print('No.', i, w[:30]) 28 wakachi_list += [w.split(' ')] 29 else: 30 print('X No.', i, w) 31 wakachi_list += [w] 32 33data = pd.DataFrame(wakachi_list) 34data.columns = ['wakachi'] 35data.head() 36 37*** 38wakachi 390 字 が 綺麗 に なり たい から \n 401 始め た きっかけ は 親 の 影響 です 。 \n 412 字 が きれい に なり たい から \n 423 字 が 綺麗 な 友人 に 憧れ て 。 \n 434 文字 を 綺麗 に 書き たい と 思っ た の で 習い 始め まし た 。 \n 44*** 45 46mecab = MeCab.Tagger() 47parse = mecab.parse(data['wakachi']) 48# for i in data['wakachi']: 49# parse = mecab.parse(i) 50 51words = [] 52lines = parse.split('\n') 53import re 54for line in lines: 55 items = re.split('[\t,]',line) 56 if len(items) >= 2 and items[1] == '助詞': 57 continue 58 words.append(items[0]) 59 60data['words'] = ' '.join(words) 61data.drop('wakachi', axis=1, inplace=True) 62data.head()

試したこと

parse部分に繰り返し処理が必要なのではと思い、

Python

1for i in data['wakachi']: 2 parse = mecab.parse(i)

を試してみたのですが、
全ての行が同じになってしまい、うまくいきません。


words
0 友人 が 師範 な の で 誘わ れ て はじめ まし た 。 10 年 近く 習っ て お...
1 友人 が 師範 な の で 誘わ れ て はじめ まし た 。 10 年 近く 習っ て お...
2 友人 が 師範 な の で 誘わ れ て はじめ まし た 。 10 年 近く 習っ て お...
3 友人 が 師範 な の で 誘わ れ て はじめ まし た 。 10 年 近く 習っ て お...
4 友人 が 師範 な の で 誘わ れ て はじめ まし た 。 10 年 近く 習っ て お...


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

Python 3.8.3 [MSC v.1924 64 bit (AMD64)] on win32
参考ページ:https://teratail.com/questions/171703

ご協力頂けますと大変助かります。
何卒宜しくお願い致します。

###追記
やりたいことは一行一行の文字列から助詞を抜きたいことです。
parseが文字列しか渡せないということで、関数を作ればいいのではと思い、
下記のようなコードを作ろうとしたのですが、
上手くいきませんでした。。

Python

1import MeCab 2import re 3def mec(text): 4 tagger = MeCab.Tagger() 5 parse = tagger.parse('') 6 word_class = [] 7 for line in lines: 8 items = re.split('[\t,]',line) 9 if len(items) >= 2 and items[1] == '助詞': 10 continue 11 words.append(items[0]) 12 13df['words'] = df['VOICE'].apply(mec) 14df.head()

エラーメッセージ

File "<ipython-input-13-a3ff3e372fa2>", line 10 continue ^ SyntaxError: 'continue' not properly in loop

###再追記
以下のコードに書き換えたところ、
出力が全て”EOS”になってしまいました。。

Python

1import MeCab 2import re 3tagger = MeCab.Tagger() 4 5 6def mec(text): 7 parse = tagger.parse('') 8 lines = parse.split('\n') 9 words = [] 10 for line in lines: 11 items = re.split('[\t,]',line) 12 if len(items) >= 2 and items[1] == '助詞': 13 continue 14 words.append(items[0]) 15 return ' '.join(words) 16 17df['words'] = df['VOICE'].apply(mec) 18df.head() 19 20###出力 21VOICE words 220 字が綺麗になりたいから EOS 231 始めたきっかけは親の影響です。 EOS 242 字がきれいになりたいから EOS 253 字が綺麗な友人に憧れて。 EOS 264 文字を綺麗に書きたいと思ったので習い始めました。 EOS

EOSがどこから出てきたのか分からず。。

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

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

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

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

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

guest

回答1

0

ベストアンサー

MeCabの使い方に関することと、Pythonの基本的な使い方(変数とループまわり)に関することが混じっていて、焦点(分からないポイント)がどこかピンと来ません。
1つ目だけ回答します。


エラーは文字列(str)を渡していないせいで起きています。
MeCab.Taggerのparseに渡せるのは文字列だけです。文字列を渡すようにしてください。


m0 = MeCab.Tagger('-Owakati')mecab = MeCab.Tagger()の間にあるコードは必要ありません(正直、コードの意図がよくわかってないんですが後述の理由から不要だということははっきり言えます)。

-Owakatiのオプションは、形態素解析した結果から形態素の情報を捨てて表層だけを空白区切りで返しなさい、という出力フォーマット指定です。
今のコードは、形態素解析して、形態素情報を捨てて表層だけ取り出して、その結果をもう一回形態素解析にかけている、という形になっています。
「やりたいこと」に対しては https://teratail.com/questions/171703 に書いてあるコードの方が近く、-Owakatiオプションで解析する理由がありません。
今の1つ目のループの中に、https://teratail.com/questions/171703 でやっている処理を入れるイメージの方がいいでしょう。


python

1tagger = MeCab.Tagger() 2 3def mec(text): 4 parse = tagger.parse('') 5 word_class = [] 6 for line in lines: 7 items = re.split('[\t,]',line) 8 if len(items) >= 2 and items[1] == '助詞': 9 continue 10 words.append(items[0]) 11 return ' '.join(words)
  1. if と words.append のインデントがずれている
  2. returnしてない

でしょうか。動かしてはないですが。

taggerはグローバルに確保していいと思います。


python

1tagger = MeCab.Tagger() 2print(tagger.parse('文字を綺麗に書きたいと思ったので習い始めました。'))

すると

plain

1文字 モジ モジ 文字 名詞-普通名詞-一般 1 2を オ ヲ を 助詞-格助詞 3綺麗 キレー キレイ 奇麗 形状詞-一般 1 4に ニ ダ だ 助動詞 助動詞-ダ 連用形-ニ 5書き カキ カク 書く 動詞-一般 五段-カ行 連用形-一般 1 6たい タイ タイ たい 助動詞 助動詞-タイ 終止形-一般 7と ト ト と 助詞-格助詞 8思っ オモッ オモウ 思う 動詞-一般 五段-ワア行 連用形-促音便 2 9た タ タ た 助動詞 助動詞-タ 連体形-一般 10の ノ ノ の 助詞-準体助詞 11で デ ダ だ 助動詞 助動詞-ダ 連用形-一般 12習い ナライ ナラウ 習う 動詞-一般 五段-ワア行 連用形-一般 2 13始め ハジメ ハジメル 始める 動詞-非自立可能 下一段-マ行 連用形-一般 0 14まし マシ マス ます 助動詞 助動詞-マス 連用形-一般 15た タ タ た 助動詞 助動詞-タ 終止形-一般 16。 。 補助記号-句点 17EOS

になりませんか? (Teratailだとタブが空白に置換されていて見え方は違うと思いますが)
素性の区切りが-で、品詞情報が5番目の項目になるのでそのあたりを直していく必要があるかと。

1度コメントに書きましたが、他人のコードがどう動いているのか確認せずに自分のコードに入れているのが、真の問題じゃないですか?
うまく動かないなら、1行ずつ動かしたりして何が起きるのか、何を意図しているのかを試して調べていく必要があります。


よくみたら引数のtextを使ってなくて常に空文を解析してます。
あと辞書が違うので品詞の取り方は変えないといけないですね。
大雑把には\t-で分解して5番目を取るんでしょうかね??

python

1def mec(text): 2 parse = tagger.parse(text) 3 word_class = [] 4 for line in lines: 5 items = re.split('[\t-]',line) 6 if len(items) >= 5 and items[4] == '助詞': 7 continue 8 words.append(items[0]) 9 return ' '.join(words)

という感じかと。
あとは必要な処理をちゃんと書いてください、としか。

投稿2021/05/13 08:36

編集2021/05/14 09:53
quickquip

総合スコア11235

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

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

Pablito

2021/05/13 08:50

ご回答ありがとうございます。 また、質問分かりづらくてすみません。 訊きたいことは助詞・助動詞を上手く取り除く方法でした。 また、バカで申し訳ないのですが、↓のようにやるとすると、 一つ目のforにURLの処理をどう上手く組み込むか分かりかねているのですが、 その点ご教示頂くことは可能でしょうか。 *** 今の1つ目のループの中に、https://teratail.com/questions/171703 でやっている処理を入れるイメージの方がいいでしょう。 ***
quickquip

2021/05/13 09:05 編集

何が"分かりかねている"のかこちらからはわかりません。 https://teratail.com/questions/171703 のコードが何をやっているのかわかっていない状態で自分のコードに入れようとしているだけではないですか?
Pablito

2021/05/13 09:41

すみません、一行一行parseして助詞を消したいのですが、 ご記載頂いている下記のイメージがそもそもイメージ付きません。 *** 今の1つ目のループの中に、https://teratail.com/questions/171703 でやっている処理を入れるイメージの方がいいでしょう。 *** MeCabの使い方を改めて見直し、一つの文字列ではなく、Dataframeの1カラムの 行全てに処理をかけたく、追記をしたように関数を作ろうと思ったのですが、 エラーが起きました。。 申し訳ございませんが、サンプルコード等をご教示頂くことは可能でしょうか。
Pablito

2021/05/14 00:43

Quickquipさん、ありがとうございます。 頂いたコードをエラーが出ないように若干修正して 実行してみたのですが、 結果が全てEOSになってしまいました。。 原因に心当たりはございますでしょうか。
Pablito

2021/05/14 02:05

1行のテキストデータだと記載頂いたコードでできると思うのですが、 それをDataframeの1カラムで複数の行を一括でparseして、 助詞を削除する方法を探しておりまして、、、 そもそもそんなことはできないのでしょうか。。
quickquip

2021/05/14 02:30

> 1行のテキストデータだと記載頂いたコードでできると思うのですが、 実際できたなら「と思う」とは書かないと感じるのですが、実際やってみてできたんでしょうか?
Pablito

2021/05/14 04:55

実際にやってみてはいて、 print(tagger.parse(df['VOICE'][0])) ↓output 字 ジ ジ 字 名詞-普通名詞-一般 1 が ガ ガ が 助詞-格助詞 綺麗 キレー キレイ 奇麗 形状詞-一般 1 に ニ ダ だ 助動詞 助動詞-ダ 連用形-ニ なり ナリ ナル 成る 動詞-非自立可能 五段-ラ行 連用形-一般 1 たい タイ タイ たい 助動詞 助動詞-タイ 終止形-一般 から カラ カラ から 助詞-接続助詞 EOS となります。 これを全ての行に適用させて助詞を取り除きたいのですが、方法はありますかね? ちなみに一行さけで良ければ下記でできます。 ps = tagger.parse(df['VOICE'][0]) line2 = ps.split('\n') words = [] import re for line in line2: items = re.split('[\t,]',line) if len(items) >= 2 and items[1] == '助詞': continue words.append(items[0]) print(' '.join(words)) *** 字 が 綺麗 に なり たい から EOS
quickquip

2021/05/14 09:47

明らかに助詞が残ってますよね……
Pablito

2021/05/14 10:14

助詞は残っていますが、ひとまず全行parseはできました。 ご協力誠にありがとうございました。 助詞の消し方は今後の課題としたいと思います。
quickquip

2021/05/14 11:10

助詞は取り除いてますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問