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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2185閲覧

品詞を数え上げるにはどうしたらいいか【追記】printの中身が表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/03 23:39

編集2019/07/05 00:36

#困っていること
青空文庫の「吾輩は猫である」から品詞を得てその数をカウントし、表示するプログラムを作っているのですが、どうすればいいかわかりません。

#該当のソースコード(実行結果は長いので省略)
以下のプログラムは同作品の形態素解析を行うプログラムです。このプログラムを元に、品詞を得てその数をカウントし、表示するプログラムを作ります。

python

1import urllib.request 2 3from janome.analyzer import Analyzer 4from janome.charfilter import * 5from janome.tokenizer import Tokenizer 6 7 8class MainTextCharFilter(CharFilter): 9 10 def __init__(self, start, end): 11 self.start = start 12 self.end = end 13 14 def apply(self, text): 15 return text.split(self.start)[1].split(self.end)[0] 16 17# 夏目漱石 18# 吾輩は猫である 19url = 'http://www.aozora.gr.jp/cards/000148/files/789_14547.html' 20 21html = '' 22 23with urllib.request.urlopen(url) as response: 24 html = response.read().decode('shift_jis') 25 26 27char_filters = [UnicodeNormalizeCharFilter(), 28 MainTextCharFilter('<div class="main_text">', '<div class="bibliographical_information">'), 29 RegexReplaceCharFilter('<rp>(.*?)</rp>', ''), 30 RegexReplaceCharFilter('<.*?>', '')] 31 32tokenizer = Tokenizer() 33 34analyzer = Analyzer(char_filters, tokenizer) 35 36for token in analyzer.analyze(html): 37 print(token) 38 39

#実行結果の一部

python

1吾輩 名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ 2は 助詞,係助詞,*,*,*,*,,,3猫 名詞,一般,*,*,*,*,,ネコ,ネコ 4で 助動詞,*,*,*,特殊・ダ,連用形,,,5ある 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル 6。 記号,句点,*,*,*,*,,,7名前 名詞,一般,*,*,*,*,名前,ナマエ,ナマエ 8は 助詞,係助詞,*,*,*,*,,,9まだ 副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ 10無い 形容詞,自立,*,*,形容詞・アウオ段,基本形,無い,ナイ,ナイ 11。 記号,句点,*,*,*,*,,,

#試したこと
上のプログラムから最後から2行目のfor token~print(token)の部分を消して、以下に書き換えてみましたが、0が延々と表示されてしまいます。

python

1meishi=0 2doushi=0 3for token in analyzer.analyze(html): 4 if token == "名詞": 5 meishi=meishi+1 6 elif token =="動詞": 7 doushi=doushi+1 8 9 print(meishi) 10 print(doushi)

#実行結果

python

10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260

#追記 (printの中身が表示されない)
「試したこと」の部分に書いたプログラムに0が延々と表示されていたのはprintをfor文の中に入れていたからでした。そこで、そのプログラムを以下に書き換えてみましたが、今度は実行画面に何も表示されなくなりました。表示するにはどうすればいいでしょうか?

python

1meishi=0 2doushi=0 3for token in analyzer.analyze(html): 4 if token.part_of_speech.split(',')[0] == "名詞": 5 meishi=meishi+1 6 elif token.part_of_speech.split(',')[0] =="動詞": 7 doushi=doushi+1 8 9print("名詞:"+str(meishi)) 10print("動詞:"+str(doushi))

#変更点
・回答のように、「if token=="名詞"」を「 if token.part_of_speech.split(',')[0] == "名詞"」に変更(動詞の部分も同様)

・printをfor文の外に移動
#回答を受けて追記(printをfor文の中に入れた時の実行結果)

python

1名詞:1 2動詞:0 3名詞:1 4動詞:0 5名詞:1 6動詞:0 7名詞:1 8動詞:0 9名詞:1 10動詞:0 11名詞:2 12動詞:0 13名詞:2 14動詞:0 15名詞:3 16動詞:0 17名詞:3 18動詞:0 19名詞:3 20動詞:0 21名詞:3 22動詞:0 23名詞:4 24動詞:0 25名詞:4 26動詞:0 27名詞:4 28動詞:0 29名詞:4 30動詞:0 31名詞:4 32動詞:0 33名詞:4 34動詞:0 35名詞:4 36動詞:0 37名詞:5 38動詞:0 39名詞:5

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

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

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

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

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

guest

回答2

0

ベストアンサー

if token == "名詞":
のところを
if token.part_of_speech.split(',')[0] == "名詞":
とかにすればよいでしょう。

参考になりそうな過去質問
https://teratail.com/questions/142519

投稿2019/07/03 23:56

daesaka

総合スコア136

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

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

退会済みユーザー

退会済みユーザー

2019/07/04 02:14

ご回答ありがとうございます。0が延々と表示されるのを防ぐためにコードを書き換えましたが、今度は実行画面に何も表示されなくなりました。どうすればいいでしょうか?書き換え後のソースコードは質問画面に追記しています。
daesaka

2019/07/04 03:55 編集

for文がまだ終了していないとかではなくてですか? 一旦print文をfor文の中に戻して確認した方がよいかと。 また、token.part_of_speech.split(',') で何が表示されるか確認してみてください。
退会済みユーザー

退会済みユーザー

2019/07/04 04:14 編集

もしかすると実行速度が遅くてまだカウントしきれていないのが原因かもしれません。(つまりfor文が終了していない)printをfor文の中に入れてみましたが、実行結果が延々と表示されます。実行結果は質問文に追記しました。
daesaka

2019/07/04 23:21 編集

大体意図した通りに動いていそうなことが確認できたので、printをfor文の外に出して実行して、ひたすら待てば欲しかった出力が得られるでしょう。
退会済みユーザー

退会済みユーザー

2019/07/05 00:33

ありがとうございます。解決しました!
guest

0

tokenをprintしてみてなにが入ってるか見てみればどうでしょう

投稿2019/07/03 23:55

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2019/07/04 03:23

ご回答ありがとうございます。tokenをprintしましたが最初の形態素解析プログラムと同じ結果が表示されました。また、。0が延々と表示されるのを防ぐためにコードを書き換えましたが、今度は実行画面に何も表示されなくなりました。どうすればいいでしょうか?書き換え後のソースコードは質問画面に追記しています。
退会済みユーザー

退会済みユーザー

2019/07/04 04:14

もしかすると実行速度が遅くてまだカウントしきれていないのが原因かもしれません。(つまりfor文が終了していない)printをfor文の中に入れてみましたが、実行結果が延々と表示されます。実行結果は質問文に追記しました。
y_waiwai

2019/07/04 04:26

forループの中に、 print(".",end="") をいれてやってみればどうでしょう。 実行中ってのがわかります #for実行中は延々と.が出力される
退会済みユーザー

退会済みユーザー

2019/07/05 00:32

その方法をやってみました。これでforループが実行中であることがわかりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問