【python】文字数カウント

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,930
退会済みユーザー

退会済みユーザー

あるファイル(sample.txt)内の文字数(特定文字の出現回数)をカウントしたいと考えています.
カウントに際しては,
・ひらがなの出現回数
・漢字の出現回数
・数字の出現回数
・片仮名の出現回数
の確認を行いたいのですが,方法がわかりません.
pythonは3.4を使用しています.

4種のカウントのうちどれか一つで構いませんので,ご教授いただけないでしょうか.
当方,初心者のため詳細な解説をいただければ幸いです.

よろしくお願いいたします.
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Python3.xの文字列はUNICODEのコードポイントの値の並び(シーケンス)ですので、判定はコードポイントがどの範囲内にあるか比較するだけです。

漢字について、中国・日本・韓国の頭文字をとってCJKと言います。UNICODEではCJKの漢字を統合して扱っています(unified ideographs)。もっともよく使われるものは0x4e00~0x9fffに収録されているようです。
http://jrgraphix.net/r/Unicode/4E00-9FFF
漢字には出現頻度の低いものを別に用意してるので、これらも含めるべきか検討してみてください。
CJK Unified Ideographs Extension A
CJK Unified Ideographs Extension B
(略)

同様にひらがなは以下の範囲にあります。
http://jrgraphix.net/r/Unicode/3040-309F

数字やカタカナもあるので調べてみてください。
(半角の数字ならstringモジュールが使えるかもしれません)

文字とコードポイント値の変換は組み込み関数のordchrを使います。
>>> ord('あ')
12354
>>> chr(12354)
'あ'
>>> chr(0x3042)
'あ'

あとはその範囲内にあるかどうかチェックする関数を作って、文字(コードポイント)ごとに判定すればいいだけです。
import sys

is_hiragana = lambda code: 0x3040 <= ord(code) <= 0x309f
is_cjk_kanji = lambda code: 0x4e00 <= ord(code) <= 0x9fff

num_hiragana, num_kanji = 0, 0
for line in sys.stdin:
    num_hiragana += sum(1 for _ in filter(is_hiragana, line))
    num_kanji += sum(1 for _ in filter(is_cjk_kanji, line))
print('漢字の数: {}'.format(num_kanji))
print('ひらがなの数: {}'.format(num_hiragana))

UNICODEコードポイントの1次情報源はこちらです。


質問についての追記(コメント欄ではマークダウン記法ができないので…)。
例に挙げてくださった,’あ’の変換は理解できるのですが,実際にテキストファイル内の文字をコードポイントへ変換する場合はどうしたらよいのでしょうか.


forとかで回せば1文字ずつ取得できますよ。

s = 'あいうえお'
for letter in s:
    print(letter, ord(letter))

$ python a.py
あ 12354
い 12356
う 12358
え 12360
お 12362

テキストファイルから読み込む場合は、使われるエンコーディングがプラットフォーム依存なのでencoding=で指定しておいたほうが良いです。

with open('some_text_file', encoding='utf-8') as f:
    for line in f:
        for letter in line:
            print(letter, ord(letter))


$ python b.py
今 20170
日 26085
は 12399
暑 26257
い 12356
! 65281

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/04 02:29

    sharow様

    ご回答ありがとうございました.
    よろしければ,もう少し教えていただきたいのですがよろしいでしょうか.

    文字をコードポイントへ変換する方法がいまひとつわかりません.
    例に挙げてくださった,’あ’の変換は理解できるのですが,実際にテキストファイル内の文字をコードポイントへ変換する場合はどうしたらよいのでしょうか.

    お手数おかけしますが,ご教授いただければ幸いです.

    キャンセル

  • 2015/08/04 06:06 編集

    質問への回答を追記に移動しました。

    キャンセル

  • 2015/08/07 13:17

    sharow様

    丁寧なご回答ありがとうございました.
    大変恐縮ですが,またご教授いただけないでしょうか.

    with open('some_text_file', encoding='utf-8') as f:
    ~~~

    の後,

    import sys
    ~~~

    を実行すればカウントが可能なのでしょうか.
    それぞれのプログラムはなんとか理解できるのですが,
    これを続けて(?)実行する方法がいまひとつわからない状態です.

    大変申し訳ございませんが,もう少しおお付き合い願えませんでしょうか.

    キャンセル

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

  • ただいまの回答率 90.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる