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

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

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

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

Mecab

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

Q&A

解決済

1回答

864閲覧

MeCabを用いたレビューにおける頻出単語のグラフ化について

yasutin

総合スコア41

Python 3.x

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

Mecab

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

0グッド

0クリップ

投稿2022/09/27 04:57

前提

pythonでMeCabを用いたレビューにおける頻出単語抽出を行っています。
月ごとの測定をしており、レビュー数の最も多い月と少ない月を比べようとグラフ化を試みましたが、レビュー数の最も多い月のグラフだけおかしくなってしまいました。

実現したいこと

・text_October_maximu.csv というファイルからグラフを作成したい。
・また、最頻出している単語が「*」になってしまうので、それを除去したい。

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

すべてのテキストから抽出したもの

最も少ないレビュー数の月から抽出したもの

最も多いレビュー数の月から抽出したもの

このように「text_October_maximum」のものだけ、グラフがおかしくなてしまいます。どうすればよいでしょうか。

また、3つのグラフいずれも最頻出単語が「*」となってしまいます。除去することはできるのでしょうか。

該当のソースコード

python

1import csv 2import pandas as pd 3import MeCab 4import collections 5import seaborn as sns 6import matplotlib.pyplot as plt 7import japanize_matplotlib 8 9files = open(r"C:\Users\Yasu\Documents\情報科学特別演習\csv\text_October_maximum.csv",encoding="utf-8",errors="ignore") 10#files = open(r"C:\Users\Yasu\Documents\情報科学特別演習\csv\text_August_minimum.csv",encoding="utf-8",errors="ignore") 11#files = open(r"C:\Users\Yasu\Documents\情報科学特別演習\csv\text_all.csv",encoding="utf-8",errors="ignore") 12 13 14data = pd.read_csv(files) 15message = data["text"] 16messagelst = message.astype(str).tolist() 17messagestr = "".join(messagelst) 18 19 20mecab = MeCab.Tagger("-Ochasen")#-Ochasenという辞書でMeCabを用いた構文解析をするよ^^ 21 22node = mecab.parseToNode(messagestr) 23words=[] 24while node: 25 hinshi = node.feature.split(",")[0] 26 if hinshi in ["名詞","動詞","形容詞"]:#名詞、動詞、形容詞 27 origin = node.feature.split(",")[6] 28 words.append(origin) 29 node = node.next 30""" 31「node.feature」には単語の品詞などの情報がカンマ区切りで入っており、 320番目に品詞名、6番目に原型のデータがある。 33そこで、node.featureの0番目が名詞・動詞・形容詞だったらその6番目をとる 34 35というコード 36""" 37######################### 38 39c = collections.Counter(words) 40""" 41collections.Counterにリストやタプルを渡すと、要素とその要素の出現回数をとる。 42""" 43 44 45sns.set(context="talk",font="IPAexGothic")#context=talkは文字サイズの大きさが3/4。MAXはcontext=poster 46fig = plt.subplots(figsize=(8,8)) 47""" 48figure:描画領域全体 49 →「fig = plt.subplots」でfigureを生成することができる 50axes:個別の座標軸 51""" 52 53sns.countplot(y=words,order=[i[0] for i in c.most_common(20)]) 54plt.show()

試したこと

・パスの確認
・CSVファイルの見比べ
・IDLEの再起動

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

windows11,IDLE(3.10.2)

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

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

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

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

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

can110

2022/09/27 05:18

「errors="ignore"」を指定しないで実行した結果を記載ください(文字コードが正しいなら不要のはず)
guest

回答1

0

ベストアンサー

このように「text_October_maximum」のものだけ、グラフがおかしくなてしまいます。

元ファイル内容が不明なので何ともいえませんが、おそらく文字化けしています。
read_csverrors指定を外して実行し、エラーが発生するようであれば、正しい文字コードを指定して読み込む必要があります。

また、3つのグラフいずれも最頻出単語が「*」となってしまいます。

固有名詞など辞書にない語の原形は*になるので、その場合はとりあえずnode.surfaceを採用するなどすればよいでしょう。

投稿2022/09/27 05:30

can110

総合スコア38266

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

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

yasutin

2022/10/01 14:45

返信が遅くなってしまい非常に申し訳ありません。文字コードのほうはおっしゃる通りで解決しました!ありがとうございました。しかし、2つ目の「*」についてはいまだ未解決です。 ””” node = mecab.parseToNode(messagestr) words=[] while node: hinshi = node.feature.split(",")[0] if hinshi in ["名詞","動詞","形容詞"]:#名詞、動詞、形容詞 origin = node.feature.split(",")[6] if node.surface != "*": words.append(origin) node = node.next ””” node.surfaceの特徴を調べてコードにくわえて使ってみましたが、アスタリスクは消えません。これはnode.surfaceで受け取った時点では固有名詞や記号であるが、グラフにするときにその単語をそのまま集計することができないということでしょうか?ご教授お願いいたします。
can110

2022/10/01 23:42

原形(origin)が「*」なら表層形(node.surface)を採用する、というコードにする必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問