はじめに
ここ最近新しいチームに参加し、仕事がバタバタしていて更新が滞ってしまっていました。
以前のチームとはかなり毛色や作業内容が異なるので、今回は新しいチームでの勉強も兼ねて記事を書いてみます。
今回は、LINEが提供しているMessaging APIを使って簡単なBotを作成してみます。
まずはサーバーを用意してMessaging APIをつなぐことが目的ですので、話しかけたときの返答は「オウム返し」をするだけにします。
ここ最近新しいチームに参加し、仕事がバタバタしていて更新が滞ってしまっていました。
以前のチームとはかなり毛色や作業内容が異なるので、今回は新しいチームでの勉強も兼ねて記事を書いてみます。
今回は、LINEが提供しているMessaging APIを使って簡単なBotを作成してみます。
まずはサーバーを用意してMessaging APIをつなぐことが目的ですので、話しかけたときの返答は「オウム返し」をするだけにします。
先日、当ブログのこの記事がはてなブックマークのホットエントリーに掲載されました。
www.madopro.net
この記事を書いている時点で500個以上のブックマークをいただいています。私が観測していた限り、このブログの記事がはてなブックマークのホットエントリや、新着エントリに掲載されたことはなので、おそらくこれが初めての掲載になるのではないでしょうか。
また、翌日にもう1記事ホットエントリー入りしました。ただし、こちらの記事は先ほどのものほどは伸びなかったですし、掲載された順位も低いものでした。。
www.madopro.net
ホットエントリーがもたらすアクセス数はすごい、というような話は噂に聞いていたのですが、実際はどうだったのか、実際に私が何を経験したのかを紹介したいと思います。
せっかくPythonでデータを扱う系の記事が掲載されたので、後半はPythonを使ってアクセスログの解析・可視化もしてみています。
具体的な数字などを早く知りたい方は、後半までスクロールしてグラフを眺めていただくか、最後の「まとめ」を見てください。
以前、TensorFlowのBasicRNNCellを使用して文字レベルの言語モデルを実装しました
シンプルなRNNで文字レベルの言語モデルをTensorFlowで実装してみる - 今日も窓辺でプログラム
今回は、前回のコードを少しだけいじって、単語レベルの言語モデルを実装します。また、RNNのセルも、単純なものからLSTMに切り替えてみます。
目次
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
私の使っている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のほうが良いですね。