【Python 2.7】日本語を要素に含むオブジェクトの標準出力は、print( pp ( オブジェクト ) ) 書式で、日本語文字列として出力可能

  • 14
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

※ 以下で定義される「 pprint モジュール の pprint( ) 関数 を組み込んだ pp() 関数 」を print( ) 関数に渡すと、文字コード数字記号でない、ちゃんとした日本語文字列が出力される

( 参考ウェブサイト )
( リンク ) 唯物是真 @Scaled_Wurm (2011-11-12)「Pythonで日本語関係のイライラ」
( リンク ) Python による日本語自然言語処理
python
import re, pprint
def pp(obj):
  pp = pprint.PrettyPrinter(indent=4, width=160)
  str = pp.pformat(obj)
  return re.sub(r"\\u([0-9a-f]{4})", lambda x: unichr(int("0x"+x.group(1), 16)), str)
pprint モジュールについては、以下を参考
( リンク ) Python documentation 8.18. pprint — データ出力の整然化
( 日本語の文字を出力させる目的以外に、リストの出力書式を見やすくする用途もあるようです )
( リンク ) Life with Python (2013/08/19)「ライブラリ:pprint」

( 以下、実行例 )

1. 和文テキストファイル mecab を使って分かち書き加工済み

( ファイル名: owakati2.heibon.txt

2.png

2. 実行スクリプト ※ word2vec 解析

( ファイル名: test.py

test.py
# !/usr/bin/env python
# -*- coding:utf-8 -*-

from gensim.models import word2vec
import re, pprint

def pp(obj):
  pp = pprint.PrettyPrinter(indent=4, width=160)
  str = pp.pformat(obj)
  return re.sub(r"\\u([0-9a-f]{4})", lambda x: unichr(int("0x"+x.group(1), 16)), str)

data = word2vec.Text8Corpus('owakati2.heibon.txt')
model = word2vec.Word2Vec(data, size=200)

out = model.most_similar(positive=u'苦労'])

print(pp(out[1]))
print(pp(out[2]))

1.png

スクリプト・ファイル test.py 実行

terminal
python2.7 test.py

( 日本語出力 成功 ! )

3.png

( スクリプト・ファイルを書き換えてみる )

out[1] , out[2] ではなく、 out リスト型オブジェクト全体を出力

test.py
# !/usr/bin/env python
# -*- coding:utf-8 -*-

from gensim.models import word2vec
import re, pprint

def pp(obj):
  pp = pprint.PrettyPrinter(indent=4, width=160)
  str = pp.pformat(obj)
  return re.sub(r"\\u([0-9a-f]{4})", lambda x: unichr(int("0x"+x.group(1), 16)), str)

data = word2vec.Text8Corpus('owakati2.heibon.txt')
model = word2vec.Word2Vec(data, size=200)

out = model.most_similar(positive=u'苦労'])

print(pp(out))

4.png

( 日本語出力 成功 ! )

terminal
python2.7 test.py

5.png

( 対話型インタプリタ画面への直接 打ち込みでも成功 )

terminal
from gensim.models import word2vec
import re, pprint

def pp(obj):
  pp = pprint.PrettyPrinter(indent=4, width=160)
  str = pp.pformat(obj)
  return re.sub(r"\\u([0-9a-f]{4})", lambda x: unichr(int("0x"+x.group(1), 16)), str)

data = word2vec.Text8Corpus('owakati2.heibon.txt')
model = word2vec.Word2Vec(data, size=200)

out = model.most_similar(positive=u'苦労'])

print(pp(out))

6.png

print( pp( ) ) でないと、日本語文字列として出力されない

Python 2系の場合

7.png

print( pp( ) ) だと、日本語文字列が 正しく出力される

※ 以下、リスト型、タプル型、辞書型、すべてのオブジェクトで和文出力問題なし

( リスト型オブジェクト )

8.png


( タプル型オブジェクト )

( 辞書型オブジェクト )

9.png


pp() 関数を定義・実行しなかった場合、文字コード割当て数字 が出力されてしまう

3.png

5.png

6.png

7.png

8.png

9.png

10.png


【 その他 参考 】

以下のスクリプトでも 日本語出力うまくゆくみたいです

ref.1.png

ref.2.png

スクリプトは、Github に資源があげられているので、easy install してインストールできるとのこと

ref.3.png

ref.4.png

上記は、以下の Qiita 記事でも取り上げられていました

zaoriku0 さん Qiita記事 投稿記事 (2014/05/04)「日本語対応prettyprintメモ(python2.7 windows7も )」

ref.5.png