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

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

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

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

Mecab

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

Q&A

解決済

2回答

625閲覧

Mecabの辞書の反映について

yasutin

総合スコア41

Python 3.x

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

Mecab

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

0グッド

0クリップ

投稿2022/12/06 16:03

前提

mecabを用いて楽天市場のレビューを形態素解析し、頻出単語を抽出するプログラムを書いています。

実現したいこと

・mecabのOchasenとipadicという辞書を反映させたい。

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

![頻出語彙ランキング20](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-07/5a5e848f-d381-46f7-acf9-a4b36f03794b.png) ![イメージ説明](https://ddjkaamml8q8x.cloudfront.net/questions/2022-12-07/cb26f847-356d-41ea-85f3-1d6207b1fe36.png) この写真の通り、辞書が反映されないと解析できない語彙が多く存在してしまう。

該当のソースコード

python

1# coding: utf-8 2import csv 3import pandas as pd 4import MeCab 5import collections 6import seaborn as sns 7import matplotlib.pyplot as plt 8import japanize_matplotlib 9 10files = open(r"C:\Users\Yasu\Documents\情報科学特別演習\csv\text_October_maximum.csv",encoding="utf-8",errors="ignore") 11 12data = pd.read_csv(files) 13message = data["text"] 14messagelst = message.astype(str).tolist() 15messagestr = "".join(messagelst) 16 17 18mecab = MeCab.Tagger("-Ochasen") 19 20node = mecab.parseToNode(messagestr) 21words=[] 22while node: 23 hinshi = node.feature.split(",")[0] 24 if hinshi in ["名詞","動詞","形容詞"]: 25 origin = node.feature.split(",")[6] 26 if node.surface != "*": 27 words.append(origin) 28 node = node.next 29 30c = collections.Counter(words) 31sns.set(context="talk",font="IPAexGothic") 32fig, ax = plt.subplots(figsize=(8,8)) 33sns.countplot(y=words,order=[i[0] for i in c.most_common(20)]) 34 35plt.show() 36 37 38

試したこと

Ochasenがインストールされているのかpower shellで確認しようとしたが、結局インストールされていない?されているかされていないのかよくわからなかった。
確認した

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

IDLE

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

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

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

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

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

guest

回答2

0

ベストアンサー

ただのコードの間違いでしょう。いったいどうしてこんなコードにしたのか自分で説明できますか? 実際にデータを見てみましたか?

plain

1>>> import MeCab 2>>> mecab = MeCab.Tagger("-Ochasen") 3>>> node = mecab.parseToNode('コラーゲンを飲んで美しく保っています') 4>>> while node: 5... print(node.surface, node.feature) 6... node = node.next 7 BOS/EOS,*,*,*,*,*,*,*,* 8コラーゲン 名詞,一般,*,*,*,*,* 9を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 10飲ん 動詞,自立,*,*,五段・マ行,連用タ接続,飲む,ノン,ノン 11で 助詞,接続助詞,*,*,*,*,で,デ,デ 12美しく 形容詞,自立,*,*,形容詞・イ段,連用テ接続,美しい,ウツクシク,ウツクシク 13保っ 動詞,自立,*,*,五段・タ行,連用タ接続,保つ,タモッ,タモッ 14て 助詞,接続助詞,*,*,*,*,て,テ,テ 15い 動詞,非自立,*,*,一段,連用形,いる,イ,イ 16ます 助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス 17 BOS/EOS,*,*,*,*,*,*,*,*

というような解析結果に対して、質問のコードでは

if node.surface != "*": words.append(origin)

としていますが、表層形(surface)が * で無ければ原形(origin)を取得する、というのはどういう意図なんでしょう?
(あと、 * が全角なんですが、本当は * と書きたかったのでしょう)

コラーゲンの行は

コラーゲン 名詞,一般,*,*,*,*,*

となっていて、表層形は コラーゲン で *ではない ので、if文に引っかかって原形の * が追加されます。
コードは書かれた通りに動いています。

本来やりたかったことは、
原形が * でない時は原形を、原形が * の時は表層形を取得する
ではなかったでしょうか?


ついでに。

"-Ochasen"は出力フォーマットの指定です。

parseToNodeは挙動が安定してない感じがあります。環境に依ると思いますが手元では余計なBOS/EOSが出てます。parseメソッドで生のテキストでの出力を取得して文字列操作した方がよい面が多いです。

plain

1>>> mecab.parse('コラーゲンを飲んで美しく保っています') 2'コラーゲン\t名詞,一般,*,*,*,*,*\nを\t助詞,格助詞,一般,*,*,*,を,ヲ,ヲ\n飲ん\t動詞,自立,*,*,五段・マ行,連用タ接続,飲む,ノン,ノン\nで\t助詞,接続助詞,*,*,*,*,で,デ,デ\n美しく\t形容詞,自立,*,*,形容詞・イ段,連用テ接続,美しい,ウツクシク,ウツクシク\n保っ\t動詞,自立,*,*,五段・タ行,連用タ接続,保つ,タモッ,タモッ\nて\t助詞,接続助詞,*,*,*,*,て,テ,テ\nい\t動詞,非自立,*,*,一段,連用形,いる,イ,イ\nます\t助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス\nEOS\n'

投稿2022/12/07 00:07

編集2022/12/07 08:34
quickquip

総合スコア11038

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

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

yasutin

2022/12/07 08:55 編集

回答ありがとうございます。 if origin == "*": words.append(node.surface) else: words.append(origin) ご指摘の通りです。 ずっと悩んでいた”*”の排除もできました。 ほんとうにありがとうございました。
guest

0

公式にある辞書って、ダウンロード&インストールされましたか?

ページ内検索ワード「MeCab 用の辞書」
https://taku910.github.io/mecab/#download

投稿2022/12/06 16:09

nnahito

総合スコア2004

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

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

yasutin

2022/12/07 09:00 編集

回答ありがとうございます。 ダウンロードはしてありますが、 その後のインストールが完了しているのかどうかはわかりません。 ダウンロードしたファイルを解凍する必要があるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問