回答編集履歴

3 誤字

sharow

sharow score 1114

2015/08/04 06:10  投稿

Python3.xの文字列はUNICODEのコードポイントの値の並び(シーケンス)ですので、判定はコードポイントがどの範囲内にあるか比較するだけです。
漢字について、中国・日本・韓国の頭文字をとって`CJK`と言います。UNICODEではCJKの漢字を統合して扱っています(unified ideographs)。もっともよく使われるものは0x4e00~0x9fffに収録されているようです。
[http://jrgraphix.net/r/Unicode/4E00-9FFF](http://jrgraphix.net/r/Unicode/4E00-9FFF)
漢字には出現頻度の低いものを別に用意してるので、これらも含めるべきか検討してみてください。
[CJK Unified Ideographs Extension A](http://jrgraphix.net/r/Unicode/3400-4DBF)
[CJK Unified Ideographs Extension B](http://jrgraphix.net/r/Unicode/20000-2A6DF)
(略)
同様にひらがなは以下の範囲にあります。
[http://jrgraphix.net/r/Unicode/3040-309F](http://jrgraphix.net/r/Unicode/3040-309F)
数字やカタカナもあるので調べてみてください。
(半角の数字ならstringモジュールが使えるかもしれません)
文字とコードポイント値の変換は組み込み関数の`ord`と`chr`を使います。
```
>>> 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次情報源は[こちら](http://unicode.org/charts/)です。
===
質問へついての追記(コメント欄ではマークダウン記法ができないので…)。
質問についての追記(コメント欄ではマークダウン記法ができないので…)。
> 例に挙げてくださった,’あ’の変換は理解できるのですが,実際にテキストファイル内の文字をコードポイントへ変換する場合はどうしたらよいのでしょうか.
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
```
2 質問への回答

sharow

sharow score 1114

2015/08/04 06:09  投稿

Python3.xの文字列はUNICODEのコードポイントの値の並び(シーケンス)ですので、判定はコードポイントがどの範囲内にあるか比較するだけです。
漢字について、中国・日本・韓国の頭文字をとって`CJK`と言います。UNICODEではCJKの漢字を統合して扱っています(unified ideographs)。もっともよく使われるものは0x4e00~0x9fffに収録されているようです。
[http://jrgraphix.net/r/Unicode/4E00-9FFF](http://jrgraphix.net/r/Unicode/4E00-9FFF)
漢字には出現頻度の低いものを別に用意してるので、これらも含めるべきか検討してみてください。
[CJK Unified Ideographs Extension A](http://jrgraphix.net/r/Unicode/3400-4DBF)
[CJK Unified Ideographs Extension B](http://jrgraphix.net/r/Unicode/20000-2A6DF)
(略)
同様にひらがなは以下の範囲にあります。
[http://jrgraphix.net/r/Unicode/3040-309F](http://jrgraphix.net/r/Unicode/3040-309F)
数字やカタカナもあるので調べてみてください。
(半角の数字ならstringモジュールが使えるかもしれません)
文字とコードポイント値の変換は組み込み関数の`ord`と`chr`を使います。
```
>>> 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次情報源は[こちら](http://unicode.org/charts/)です。
UNICODEコードポイントの1次情報源は[こちら](http://unicode.org/charts/)です。
===
質問へついての追記(コメント欄ではマークダウン記法ができないので…)。
> 例に挙げてくださった,’あ’の変換は理解できるのですが,実際にテキストファイル内の文字をコードポイントへ変換する場合はどうしたらよいのでしょうか.
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
```
1 修正

sharow

sharow score 1114

2015/08/02 17:13  投稿

Python3.xの文字列はUNICODEのコードポイントの値の並び(シーケンス)ですので、判定はコードポイントの範囲内にあるか比較するだけです。
Python3.xの文字列はUNICODEのコードポイントの値の並び(シーケンス)ですので、判定はコードポイントがどの範囲内にあるか比較するだけです。
漢字について、中国・日本・韓国の頭文字をとって`CJK`と言います。UNICODEではCJKの漢字を統合して扱っています(unified ideographs)。もっともよく使われるものは0x4e00~0x9fffに収録されているようです。
[http://jrgraphix.net/r/Unicode/4E00-9FFF](http://jrgraphix.net/r/Unicode/4E00-9FFF)
漢字には出現頻度の低いものを別に用意してるので、これらも含めるべきか検討してみてください。
[CJK Unified Ideographs Extension A](http://jrgraphix.net/r/Unicode/3400-4DBF)
[CJK Unified Ideographs Extension B](http://jrgraphix.net/r/Unicode/20000-2A6DF)
(略)
同様にひらがなは以下の範囲にあります。
[http://jrgraphix.net/r/Unicode/3040-309F](http://jrgraphix.net/r/Unicode/3040-309F)
数字やカタカナもあるので調べてみてください。
(半角の数字ならstringモジュールが使えるかもしれません)
文字とコードポイント値の変換は組み込み関数の`ord`と`chr`を使います。
```
>>> 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次情報源は[こちら](http://unicode.org/charts/)です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る