読者です 読者をやめる 読者になる 読者になる

今日も窓辺でプログラム

外資系企業勤めのエンジニアが勉強した内容をまとめておくブログ

初めてはてなブックマークのホットエントリーに掲載されたので、アクセスログを解析してみた

ブログについて Python

ホットエントリーに掲載されました

先日、当ブログのこの記事がはてなブックマークのホットエントリーに掲載されました。
www.madopro.net

この記事を書いている時点で500個以上のブックマークをいただいています。私が観測していた限り、このブログの記事がはてなブックマークのホットエントリや、新着エントリに掲載されたことはなので、おそらくこれが初めての掲載になるのではないでしょうか。

また、翌日にもう1記事ホットエントリー入りしました。ただし、こちらの記事は先ほどのものほどは伸びなかったですし、掲載された順位も低いものでした。。
www.madopro.net

ホットエントリーがもたらすアクセス数はすごい、というような話は噂に聞いていたのですが、実際はどうだったのか、実際に私が何を経験したのかを紹介したいと思います。
せっかくPythonでデータを扱う系の記事が掲載されたので、後半はPythonを使ってアクセスログの解析・可視化もしてみています。

具体的な数字などを早く知りたい方は、後半までスクロールしてグラフを眺めていただくか、最後の「まとめ」を見てください。

続きを読む

RNN/LSTMを使った言語モデルをTensorFlowで実装してみる

Deep Learning NLP Python TensorFlow 機械学習

はじめに

以前、TensorFlowのBasicRNNCellを使用して文字レベルの言語モデルを実装しました
シンプルなRNNで文字レベルの言語モデルをTensorFlowで実装してみる - 今日も窓辺でプログラム

今回は、前回のコードを少しだけいじって、単語レベルの言語モデルを実装します。また、RNNのセルも、単純なものからLSTMに切り替えてみます。

続きを読む

Pythonの標準出力でのUnicodeEncodeErrorの原因となる文字を置換する方法

Python

目次

標準出力でのUnicodeEncodeError

Pythonで日本語の処理をしていると、UnicodeEncodeErrorに出くわすことがあるかと思います。

例えば私が今回遭遇したのは、print()で標準出力に表示しようとしたテキストに「!」マークが二つ並んだ文字、Unicodeでいうと\u203cが含まれていたために、次のようなエラーが表示され処理が止まってしまいました。

再現するとこんな感じです。

>>> print('こんにちは\u203c')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'cp932' codec can't encode character '\u203c' in position 0: illegal multibyte sequence

標準出力はio.TextIOWrapperで管理されている

私の使っているPython 3.5.2では、sys.stdoutはio.TextIOWrapperというオブジェクトです。

>>> import sys
>>> sys.stdout
<_io.TextIOWrapper name='<stdout>' mode='w' encoding='cp932'>

このio.TextIOWrapperは、errorsという引数を渡すことでエンコードやデコード時のエラーの処理方法を指定することができます。
公式ドキュメントにあるように、次のようなオプションがサポートされています。

引数の値 意味
strict 例外を発生させる
ignore 無視する
replace '?'などのマーカーで置き換える
backslashreplace バックスラッシュ付きのエスケープシーケンスに置き換える
xmlcharrefreplace XMLの文字参照に置き換える
namereplace \N{...}エスケープシーケンスに置き換える

他の形式も指定できるようですが、詳細はドキュメントを当たってください。

解決方法

例えば不正な文字を'?'マークに置き換えるのであれば、標準出力(sys.stdio)を次のようなio.TextIOWrapperに置き換えてあげます。

>>> import sys
>>> import io
>>> sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=sys.stdout.encoding, errors="replace")
>>> print('こんにちは\u203c')
こんにちは?

これで、最後の文字が'?'に置換して表示されました。

ちなみに、backslashreplaceを指定するとこんな感じです。

>>> sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding=sys.stdout.encoding, errors="backslashreplace")
>>> print('こんにちは\u203c')
こんにちは\u203c

元の文字の情報を保持しておきたいときは、backslashreplaceやxmlcharrefreplaceのほうが良いですね。


CNTKでロジスティック回帰を試してみました

機械学習 CNTK

はじめに

CNTKのチュートリアルの一つ目の題材がロジスティック回帰だったので、チュートリアルに沿ってロジスティック回帰をしてみます。
今回は、下記のチュートリアルを追いかけたものを日本語で解説しているような記事になります。
CNTK/CNTK_101_LogisticRegression.ipynb at v2.0.beta9.0 · Microsoft/CNTK · GitHub

CNTKの環境構築は前回の記事で行っているので、環境が整っていない方はこちらもご参照ください。
www.madopro.net

(2017/1/30追記)
なぜかチュートリアルの日本語版が存在していました。ほかの言語は用意されていないっぽいのに、なぜ。

続きを読む