これ何て呼びますか

PythonのJanomeを使って品詞の比率を求めたのですが、このプログラムに何を付けたしたらいいでしょうか?

import urllib.request

from janome.analyzer import Analyzer
from janome.charfilter import *
from janome.tokenizer import Tokenizer


class MainTextCharFilter(CharFilter):

def __init__(self, start, end):
self.start = start
self.end = end

def apply(self, text):
return text.split(self.start)[1].split(self.end)[0]

# 夏目漱石
# 吾輩は猫である
url = 'http://www.aozora.gr.jp/cards/000148/files/789_1 …

html = ''

with urllib.request.urlopen(url) as response:
html = response.read().decode('shift_jis')

char_filters = [UnicodeNormalizeCharFilter(),
MainTextCharFilter('<div class="main_text">', '<div class="bibliographical_information">'),
RegexReplaceCharFilter('<rp>\(.*?\)</rp>', ''),
RegexReplaceCharFilter('<.*?>', '')]

tokenizer = Tokenizer()

analyzer = Analyzer(char_filters, tokenizer)

meishi=0
josi=0
kigou=0
doushi=0
jodousi=0
fukusi=0
settousi=0
keiyousi=0
renntaisi=0
setuzokusi=0
kandousi=0
fira=0
for token in analyzer.analyze(html):
if token.part_of_speech.split(',')[0] == "名詞":
meishi=meishi+1
elif token.part_of_speech.split(',')[0] =="助詞":
josi =josi+1
elif token.part_of_speech.split(',')[0] =="記号":
kigou=kigou+1
elif token.part_of_speech.split(',')[0] =="動詞":
doushi=doushi+1
elif token.part_of_speech.split(',')[0] =="助動詞":
jodousi=jodousi+1
elif token.part_of_speech.split(',')[0] =="副詞":
fukusi=fukusi+1
elif token.part_of_speech.split(',')[0] =="接頭詞":
settousi=settousi+1
elif token.part_of_speech.split(',')[0] =="形容詞":
keiyousi=keiyousi+1
elif token.part_of_speech.split(',')[0] =="連体詞":
renntaisi=renntaisi+1
elif token.part_of_speech.split(',')[0] =="接続詞":
setuzokusi=setuzokusi+1
elif token.part_of_speech.split(',')[0] =="感動詞":
kandousi=kandousi+1
elif token.part_of_speech.split(',')[0] =="フィラー":
fira=fira+1

print("名詞:"+str(meishi))
print("助詞:"+str(josi))
print("記号:"+str(kigou))
print("動詞:"+str(doushi))
print("助動詞:"+str(jodousi))
print("副詞:"+str(fukusi))
print("接頭詞:"+str(settousi))
print("形容詞:"+str(keiyousi))
print("連体詞:"+str(renntaisi))
print("接続詞:"+str(setuzokusi))
print("感動詞:"+str(kandousi))
print("フィラー:"+str(fira))


実行結果

名詞:58432
助詞:61080
記号:25630
動詞:28901
助動詞:19816
副詞:6576
接頭詞:1519
形容詞:3599
連体詞:2145
接続詞:1398
感動詞:740
フィラー:226

と表示されます

A 回答 (3件)

ああ、これもそうか。



時系列的には逆になるけど、これも

https://oshiete.goo.ne.jp/qa/12149679.html

の続き。
まずこれもデータの扱い方がなってない。それが混乱の原因。
Pythonを使うには

「まずはリストを使いこなす」

ってのを目標にしないといけない。
そして出力は考えない。前にも書いたけど、出力はあとでどーにでもなる。
そんな事にアタマ使う前に、

・品詞の比率を求めたい

と言う目的があるのなら、全力で品詞の比率を求める。
何度でも言いますが、出力はあとでどーにでもなります。

さて、品詞の比率ってこたぁ、当然「ある特定の品詞の総数」/「品詞数の総和」って事です。
今、データはこうなってる。

a = [['名詞', 58432], ['助詞', 61080], ['記号', 25630], ['動詞', 28901], ['助動詞', 19816], ['副詞', 6576], ['接頭詞', 1519], ['形容詞', 3599], ['連体詞', 2145], ['接続詞', 1398], ['感動詞', 740], ['フィラー', 226]]

まず品詞数の総和を求めるにはどうすればいいのか。
例えば対象が単なる数値のリストだった場合、Pythonだとsum関数を使えば総数は簡単に求められる。

>>> sum([1, 2, 3, 4, 5])
15

しかし、連想リストaは二次元リストであって、しかもタグとして文字列を含んでいる。これをそのままsumに手渡すわけにはいかない。
こういう場合も「リスト内包表記」を使う。連想リストから各要素の第1要素を引っこ抜いたリストをリスト内包表記で作れば良い。

>>> [item[1] for item in a]
[58432, 61080, 25630, 28901, 19816, 6576, 1519, 3599, 2145, 1398, 740, 226]

重要なのは第1要素なので、第0要素を無視したリストをリスト内包表記で表現すれば良いだけだ。
そしてこいつをsumに手渡せば総数は簡単に分かる。

>>> sum([item[1] for item in a])
210062

こいつを変数にでも保存しておけば良い。

denominator = sum([item[1] for item in a])

こいつで連想リストaの各要素の第1要素を割っていけば、取り敢えず「比率」は分かるわけだ。
実は比率を求める為の連想リストaに対する根本的な操作方法は先程の連想リストから数値だけのリストを生成するのに似てる。要素の第1要素だけ操作すれば事足りる、ってのが全く同じだからだ。
よって、ここでもリスト内包表記を使って次のように書く。

>>> [[item[0], item[1] / denominator] for item in a]
[['名詞', 0.2781654939970104], ['助詞', 0.2907712960935343], ['記号', 0.12201159657624892], ['動詞', 0.13758318972493835], ['助動詞', 0.09433405375555788], ['副詞', 0.03130504327293847], ['接頭詞', 0.00723119840808904], ['形容詞', 0.017133036912911428], ['連体詞', 0.010211270958098085], ['接続詞', 0.0066551779950681225], ['感動詞', 0.0035227694680618105], ['フィラー', 0.0010758728375432015]]
>>>

これで見ると「名詞」の存在率は28%弱と言うのはすぐ分かるし、助詞も29%程度ってのもすぐ分かる。キチンと品詞別に「存在比率」ってのが表されているからだ。
敢えてタグも残してるので、判別も付きやすい。
これで終了、である。あとは印字するだけ、だけどそれは前書いたのと同じなんで、省いておく。
    • good
    • 0
この回答へのお礼

ありがとうございます!無事できました

お礼日時:2021/01/21 21:38

>今のプログラムの実行結果を残しつつ、比率を出したいのです。

比率の計算をどこに入れて、どのようにプリントを使って表示させるのかが知りたいです。
どこに入れる-->今の実行結果を表示するプログラムの後に
どのように-->今のプログラム中のprint文と同じようなものを使う
例えば
print("名詞:"+str(meishi)) の後に
print("名詞の比率:" +str(meishi/tango_kosuu)
(注:tango_kosuu = meisi + josi + ...+ fira)

かな?たぶん(晩酌の後なので...)

でも、なんで他の人の書き込みがないんだろ?
詳しい人はいっぱいいるはずなのに
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。無事表示することに成功しました。もう一つ質問があるのですが、このprintで表示してる部分って降順とかにする場合、どのようなプログラムを入れたらいいのでしょうか。

お礼日時:2021/01/15 18:34

Pythonは全く知りませんが


>PythonのJanomeを使って品詞の比率を求めたのですが、このプログラムに何を付けたしたらいいでしょうか?
比率というからには全体の単語(?)の個数で割る必要があるんじゃないですか?
    • good
    • 0
この回答へのお礼

今のプログラムの実行結果を残しつつ、比率を出したいのです。比率の計算をどこに入れて、どのようにプリントを使って表示させるのかが知りたいです。

お礼日時:2021/01/12 13:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!