
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件)
- 最新から表示
- 回答順に表示
No.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%程度ってのもすぐ分かる。キチンと品詞別に「存在比率」ってのが表されているからだ。
敢えてタグも残してるので、判別も付きやすい。
これで終了、である。あとは印字するだけ、だけどそれは前書いたのと同じなんで、省いておく。
No.2
- 回答日時:
>今のプログラムの実行結果を残しつつ、比率を出したいのです。
比率の計算をどこに入れて、どのようにプリントを使って表示させるのかが知りたいです。どこに入れる-->今の実行結果を表示するプログラムの後に
どのように-->今のプログラム中のprint文と同じようなものを使う
例えば
print("名詞:"+str(meishi)) の後に
print("名詞の比率:" +str(meishi/tango_kosuu)
(注:tango_kosuu = meisi + josi + ...+ fira)
かな?たぶん(晩酌の後なので...)
でも、なんで他の人の書き込みがないんだろ?
詳しい人はいっぱいいるはずなのに
ご回答ありがとうございます。無事表示することに成功しました。もう一つ質問があるのですが、このprintで表示してる部分って降順とかにする場合、どのようなプログラムを入れたらいいのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 日本語 名詞、動詞、形容詞、副詞・・・などは品詞 ・a part of speech と呼ばれます。 ところ 2 2023/02/20 13:32
- 英語 A healthy 20 centimeters tall の a がなぜ定冠詞でないのでしょうか? 2 2022/10/14 05:21
- 英語 「to不定詞」を目的語に直接取れない動詞で、なお「to不定詞」で表現したい場合の方法について 2 2022/07/11 10:17
- 英語 A healthy 20 centimeters tall の a がなぜ定冠詞でないのでしょうか? 2 2022/10/22 04:40
- 英語 写真の英文についてですが、複合関係詞のhoweverの後ろは、副詞(形容詞)S+Vという順番になりま 2 2023/08/08 19:10
- 英語 After 4 years from the treatments 98% of success w 1 2022/10/06 13:02
- 英語 The bicycle became part of a grassroots recreation 1 2023/02/08 15:50
- 英語 moreの品詞と用法について 6 2022/10/20 04:24
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- TOEFL・TOEIC・英語検定 下記の文の前置詞句について不明点があります •This soup smells of lemon. 2 2022/07/04 19:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイルのデータの半角スペー...
-
シェルスクリプトで、空白(ス...
-
正規表現<置き換え>が実行して...
-
Pythonでコンソールをクリアす...
-
lispについて。lspファイルの読...
-
FORM ACTION~POST使用時について
-
substrの文字列の境界の動作に...
-
awkの正規表現での最左最短マッ...
-
数値英単語変換
-
関数「exists」と「defined」の...
-
Python3
-
python超初心者です(3時間目)。...
-
pythonについて
-
JSONで文字列が長い時
-
オプションメニュー設定について
-
プルダウンを外部リンクする
-
LISPで連想配列の操作?
-
Application.ScreenUpdating = ...
-
メモリをアドレスを直接指定し...
-
Pythonのプログラミングの質問...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
パイソンのクラスについて
-
【至急!!!】python言語で本を見...
-
シェルスクリプトで、空白(ス...
-
I2C接続のLCDディスプレイを使う
-
awkの正規表現での最左最短マッ...
-
awk の int()に関数について
-
UWSCのSELECT文の記述方法
-
pythonで演算子を変数に代入す...
-
c言語 16進数の2進数への変換
-
関数「exists」と「defined」の...
-
正規表現<置き換え>が実行して...
-
変数の中は文字列か数値か調べ...
-
レコード取得件数の表示位置に...
-
ソケットでのデータ送受信につ...
-
$x=''とした場合と$x=0とした場...
-
シェルスクリプト+perl
-
[Ruby] irbにおける文字化け
-
Perlにおける<?phpinfo();?>の...
-
フォームの内容を確認画面で表示
おすすめ情報