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

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

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

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

Mecab

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

自然言語処理

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

データベーススペシャリスト

データベーススペシャリスト試験 (DB)は、IPA 独立行政法人 情報処理推進機構の実施している国家資格です。

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

1034閲覧

N-gramで出現している単語のカウントの仕方を知りたい

tina

総合スコア2

Pythonista

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

Mecab

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

自然言語処理

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

データベーススペシャリスト

データベーススペシャリスト試験 (DB)は、IPA 独立行政法人 情報処理推進機構の実施している国家資格です。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2022/12/28 01:05

編集2022/12/28 02:29

N-gramで分析した結果から単語のカウントを行いたいのですがやり方がよく分かりませんでした。実行結果のような処理をしたのちに、単語ごとのカウントを行いたいと考えています。こちらの例に対して出力したい内容としては、
煮干し,3
最近,3
濃い,3
.,2
ラーメン屋,1
さん,1
です,1
といったように左側に単語、右側に出現数のカウントを行いたいです。

該当のソースコード

Python

1import pandas as pd 2import MeCab 3import re 4from collections import Counter 5import numpy as np 6import matplotlib.pyplot as plt 7 8# ファイル読み込み 9# 対象ファイルの読み込みと形態素解析の実施 10with open('data/review_high.csv', encoding='utf-8') as f: 11 str = f.read() 12 13def format_text(text): 14 text = text.lower() 15 text = re.sub(r'[0-90-9a-zA-Z]+', "", text) #半角 16 text = re.sub(r'[!$%&\’\\\\()*+,-./:;?@[\\]^_`{|}~「」〔〕“”〈〉『』【】&*・()$#@?!`+¥%]', "", text) 17 18 return text 19 20mecab = MeCab.Tagger("-Ochasen -u \"C:/laboratory/MeCab/dic/neologd/neologd.dic\"") 21str = format_text(str) 22work_mecab_arry = mecab.parse(str).splitlines() 23 24# 形態素解析結果の配列形式の変更 25mecab_arry = [] 26for u in work_mecab_arry: 27 member = [] 28 member = re.split('\t',u) 29 mecab_arry.append(member) 30 31# 形態素解析結果から単語部分の抽出 32word_arry = [] 33for u in mecab_arry: 34 word_arry.append(u[0]) 35 36with open('data/japanese.txt',encoding='utf-8') as f: 37 stop_words = f.read().splitlines() 38 39result_word_list = [] 40 41for line in mecab.parse(str).splitlines(): 42 if line is None or line == '' or line == 'EOS' or len(line.split()) < 4: 43 continue 44 for target_part_of_speech in target_parts_of_speech: 45 if target_part_of_speech == line.split()[3]: 46 word = line.split()[2] 47 if not word in stop_words: 48 result_word_list.append(word) 49 50# 2-gram, 3-gramの配列作成 51bg_list = list(zip(word_arry[:-1],word_arry[1:])) 52tg_list = list(zip(word_arry[:-2],word_arry[1:-1],word_arry[2:])) 53 54# 2-gram, 3-gramの頻度のカウント 55bigram_arry = Counter(bg_list) 56trigram_arry = Counter(tg_list) 57 58# 分析結果の表示 59for k, v in sorted(bigram_arry.items(), key=lambda x:x[1], reverse=True): 60 print(k, v) 61 62for k, v in sorted(trigram_arry.items(), key=lambda x:x[1], reverse=True): 63 print(k, v) 64 65

ここまでの実行結果(一部抜粋)

('です', '.', '最近') 1 ('.', '最近', '濃い') 1 ('最近', '濃い', '煮干し') 1 ('濃い', '煮干し', 'ラーメン屋') 1 ('煮干し', 'ラーメン屋', 'さん') 1

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

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

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

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

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

quickquip

2022/12/28 01:27 編集

このあと何がしたいのかが──つまり > N-gramで分析した結果から単語のカウントを行いたい > 単語ごとのカウントを行いたい の部分が伝わりません。
tina

2022/12/28 01:30

失礼しました。参考にしているブログを張り付けてもよろしいでしょうか?そこで行われているような結果を取得したいと考えているのですが、、、KH Code 3で単語抽出を行おうと考えて上記の結果をテキストファイルに出力しようとも考えたのですが上手くいかずで
quickquip

2022/12/28 02:12

だとすると、入力の例 ('です', '.', '最近') 1 ('.', '最近', '濃い') 1 ('最近', '濃い', '煮干し') 1 ('濃い', '煮干し', 'ラーメン屋') 1 ('煮干し', 'ラーメン屋', 'さん') 1 に対して「このような形式にしたい」という「欲しい出力」を書くのがよいと思います。 できればその上で何に詰まっているのかがあればいいのですが(そうでないと修正依頼がくるので)、少なくとも、やりたいものの仕様を説明する こと/能力 が 質問/プログラミング には必要です。
tina

2022/12/28 02:15

('です', '.', '最近') 1 ('.', '最近', '濃い') 1 ('最近', '濃い', '煮干し') 1 ('濃い', '煮干し', 'ラーメン屋') 1 ('煮干し', 'ラーメン屋', 'さん') 1 こちらの例に対して出力したい内容としては、 煮干し,3 最近,3 最近,2 といった形にしたいと考えています。
quickquip

2022/12/28 02:26

という感じで出力したいことが質問に書いてあると、 3や2はどういう数字ですか? '最近'が2なのはなぜですか? '濃い' 'ラーメン屋' 'です' 'さん' '.' がないのはなぜですか? といった **具体的な** ことがきけるようになるのです。 質問を修正しましょう。
tina

2022/12/28 02:30

丁重なご指導ありがとうございます。参考になります。未熟な私に対して親切な対応ありがとうございます。
guest

回答1

0

ベストアンサー

https://docs.python.org/ja/3/library/itertools.html#itertools.chain.from_iterable

itertools.chain.from_iterableを使って、

from itertools import chain (略) bigram_arry = Counter(chain.from_iterable(bg_list)) trigram_arry = Counter(chain.from_iterable(tg_list))

と書けると思います。


ただ、これは単に

trigramの場合
先頭要素と末尾要素を1
先頭要素の次と末尾要素の前を2
他を3
と重みを付けただけで、普通に単語数え上げをするのとあまり違わないんじゃないかと感じました。

投稿2022/12/28 04:21

quickquip

総合スコア11213

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

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

tina

2022/12/28 04:52

なるほど、、、もう少し考察を深めて考えます!コードは確かに挙動通りになりました!ご指摘等ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問