MeCabをPythonで使う - 文字コードの取扱い
Windows 8.1 64 bit Python 32 bit 環境でMeCabを使う。
上記環境でのインストールは以下の記事通りに進めることでできました。感謝。
WindowsでMeCab Pythonを使う - 人工知能に関する断創録
インストール後に問題が。外部テキストファイルを読み込んで形態素解析し、テキストファイル"test_anal.txt"に出力するというもの。
# -*- coding: utf-8 -*- import MeCab import sys m = MeCab.Tagger("-Ochasen") f = open('test.txt','r') try: text = f.read() finally: f.close() f = open('test_anal.txt','w') try: f.write(m.parse(text)) finally: f.close()
結果は文字化け。
>test_anal.txt 今日はチ・今日はチ・今日はチ・險伜捷-荳闊ャ L L L 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ ン・ン・ン・險伜捷-荳闊ャ ^ ^ ^ 蜷崎ゥ・繧オ螟画磁邯・ ・・・險伜捷-荳闊ャ c c c 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ ・・・險伜捷-荳闊ャ ^ ^ ^ 蜷崎ゥ・繧オ螟画磁邯・ 弁当が・弁当が・弁当が・險伜捷-荳闊ャ H H H 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ べたい・べたい・べたい・險伜捷-荳闊ャ ナ・ナ・ナ・蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ キ・キ・キ・險伜捷-荳闊ャ B B B 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ Python Python Python 蜷崎ゥ・荳闊ャ - - - 蜷崎ゥ・繧オ螟画磁邯・ MeCab MeCab MeCab 蜷崎ゥ・荳闊ャ の・の・の・險伜捷-荳闊ャ e e e 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ ・・・險伜捷-荳闊ャ X X X 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ ・・・險伜捷-荳闊ャ g g g 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ ・・・險伜捷-荳闊ャ B B B 蜷崎ゥ・蝗コ譛牙錐隧・邨・ケ・ EOS
ここでUTF-8で受け渡ししないといけないことに気付く。
# -*- coding: utf-8 -*- import MeCab import sys m = MeCab.Tagger("-Ochasen") f = open('test.txt','r') try: text = f.read().decode('utf-8') #ここも変更したのだが・・・以下エラーにつながる。 finally: f.close() f = open('test_anal.txt','w') try: f.write(m.parse(text.encode('utf-8'))) #ここが大事。 finally: f.close()
ところがエラー。
C:\temp\>python test014.py Traceback (most recent call last): File "test014.py", line 6, in <module> text = f.read().decode('utf-8') File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0x8d in position 0: invalid start byte
悩んだ結果、文章を読み込む側のtest.txtのエンコーディングがshift_jisだったことに気づく。
test.txtをf.read()のエンコーディングで'shift_jis'を指定しなければ。
# -*- coding: utf-8 -*- import MeCab import sys m = MeCab.Tagger("-Ochasen") f = open('test.txt','r') try: text = f.read().decode('shift_jis') #読み込むファイルのエンコーディングはshift_jis finally: f.close() f = open('test_anal.txt','w') try: f.write(m.parse(text.encode('utf-8'))) finally: f.close()
やった。
>test_anal.txt 今日 キョウ 今日 名詞-副詞可能 は ハ は 助詞-係助詞 チキンタツタ チキンタツタ チキンタツタ 名詞-一般 弁当 ベントウ 弁当 名詞-一般 が ガ が 助詞-格助詞-一般 食べ タベ 食べる 動詞-自立 一段 連用形 たい タイ たい 助動詞 特殊・タイ 基本形 です デス です 助動詞 特殊・デス 基本形 。 。 。 記号-句点 Python Python Python 名詞-一般 - - - 名詞-サ変接続 MeCab MeCab MeCab 名詞-一般 の ノ の 助詞-連体化 テスト テスト テスト 名詞-サ変接続 。 。 。 記号-句点 EOS
まとめ
1) MeCabにはstrで渡す。
2) 'xxx'.decode('文字コード')は文字列'xxx'を'文字コード' -> unicodeに変換するもの。
サーバー関連のデモにVirtual Router Managerが便利
WEBサーバーのデモしたい時にモバイルルーターなどの何かしらの設備が必要なのかと調べましたが、WindowsにはWindows 7 からsoftapという機能が搭載されていることを知りました。
名前の通りPCのWifiを使ってルーター機能を再現するというもので、WSHでこの機能を有効にできるようなのだけど、私の環境ではなぜかうまくいかなかった。ので、Virtual Router Managerという上記のスクリプトと同じ機能をしてくれるソフトウェアを見つけました。特に難しい設定はなくて、SSIDとPasswordを設定するだけ。PC上ではWifiはONにしておきましょう。設定したSSIDでアクセスポイントが作成され他の端末からこのPCにアクセスできます。WEBサーバーのデモなんてしないという方でもsambaやアップローダー等立ち上げれば出先で簡易NASとして使えて、オフ会やセミナーなどで資料共有したりなどまあまあ実用的かも。
JSONファイルのPythonでの扱い方
json.dumpsで、他のプログラムからもアクセスできるjson形式に変換する。これをしないとシングルクオテーションをjson内で使ったり(jsonはダブルクオテーションで各項目をくくらないといけない)するなどjson.loadsでロードできなくなる。
>jsonwrite.py # -*- coding: utf-8 -*- import json f = open('jsonDB.txt', 'a') json_test = json.dumps({"Date":"2015-03-01", "Points":"test", "Steps":105}) try: f.write(str(json_test)) finally: f.close()
jsonを読み込むにはjson.loadsを使う。json_test['キー名']でキーに対応する値を取得。
> jsonwrite.py # -*- coding: utf-8 -*- import json f = open('jsonDB.txt') json_raw= f.read() json_test = json.loads(json_raw) print json_test['Date']
参考
Pythonの基礎 ファイル(JSON)の読み込み編 - Pythonの学習の過程とか
pythonのurllib2でjsonを取得して解析する - 文系プログラマによるTIPSブログ
ASUS Taichi 21 Windosws 8.1 で PTV3000を使う
はまったのでメモ。
1. メーカーのページからPTV3000のドライバをダウンロードしアップデート。
http://www.netgear.jp/products/details/PTV3000.html?page=download
2. 公式サイトから、ASUS Taichi 21のビデオドライバーをダウンロードしアップデート。
3. 続けてインテルのサイトからインテル WiDiのアップデートツールを使い更新しようとするも、適用できないといわれ更新できず。
http://www.intel.com/p/ja_JP/support/highlights/wireless/wireless-display
これでドライバ周りはOKと思ったので、Intel Corporation→Intel WiDi→Intel(R) WiDi アプリケーションでPTV3000を認識するも、PTV3000側で表示がされない。
ここでいろいろ調べていると、このソフトはWindows 8.1では使えずに、WIndows のチャーム上から設定できるらしいことがわかった。
チャーム上のデバイス→表示→別のディスプレイに接続→Push2TVxxxx である。こうすると、無事にTaichiとPTV3000が接続されるようになった。
まさか操作方法が変わっているとは・・・
Misfit Shine データの保存日数と装着位置について
Misfit Shine、二か月前に購入して使っています。Nikeの物などと比べると防水というのと電池交換が数か月は不要というのが、ものぐさな性格にぴったり合っています。
さて今回使っていて気になることがあったので、いくつか試してみました。
1. iPhoneと同期しない場合、データは何日間キープされる?
Shineはボタン電池採用のおかげで数か月は充電が必要ない点が、大変便利です。でも毎日iPhoneと同期させるのは面倒です。そうなると気になるのはデータの保存。こんな小さいボディにどれだけのデータを保存しておけるのでしょう?実験してみました。
実験内容
2週間間隔をおいて同期させる。同期ができるか?
結果。無事2週間分のデータが一度の同期で完了しました。
2. 装着位置による歩数の違い
もうひとつ実験を。Shineでは装着位置を胸、手頸、腰、足首から設定できるようになっていますが、設定できるということは装着位置によって歩数が補正されているはず。装着位置によって歩数にどのような違いがでてくるのか、チェックしてみました。
実験内容
装着位置:腰と、装着位置:腕(手首)の装着位置をShineアプリ上でそれぞれ設定し、会社から自宅までの約1.8kmを歩き、歩数とカロリー記録した。また、実際には腕に装着しているがShineソフト上での装着位置を腰にする、つまり設定が間違っていた場合どのような誤差が出るのかも実験した。以下の計4パターンで実験を行った。
- 実際の装着位置:手首、Shine設定の装着位置:手首 (設定位置:正しい)
- 実際の装着位置:腰、Shine設定の装着位置:腰 (設定位置:正しい)
- 実際の装着位置:手首、Shine設定の装着位置:腰 (設定位置:誤り)
- 実際の装着位置:腰、Shine設定の装着位置:手首 (設定位置:誤り)
これらを各二回ずつ行い、Shineアプリ上で歩数と消費カロリーを記録した。以下の表はこの平均値である。
結果は以下のとおり。
歩数
カロリー
- 設定位置が実際に装着している位置と正しい場合は、腰につけていても手首につけていても歩数に大きな差はなかった。(設定位置が正しい場合:0.8%、誤りの場合:8%)
- 装着位置を間違えた場合、いずれの組み合わせでも、正しい場合よりも値が大きくなった。実験では最大2.9%の差である。ただしカロリー値では誤差の値が非常に小さくなった。(0.2%)
- 歩数値とカロリー値では単純な比例関係にあると思っていたが、結果は異なっていた。激しい運動とそうでない運動を認識しているので、激しい運動や持続的な運動ではカロリーが増える、といった補正計算をしているのかも。
Maker Faire シンセン
せっかく中国に住んでいるのだから、と、遠征してシンセンのMaker Faireにいてきました。まず日本と違うなと思ったのは、会場が野外であること。お祭り感が出ていてよかったです・・・が、天気はあいにくの雨でした・・・。
そしてもうひとつ違うと思ったのは商業的&教育的な出展が多かったなあということでした。教育用のボードやArduinoの互換品の出品が結構多かったな、という印象です。ネタ系がなかったのが少し寂しい。
会場前ではトランスフォーマーがお出迎え。
雨でした。
小さいドローン?
Phillippes HueのようなLED電球の展示もありました。
帰りにシンセンの電子部品街をのぞいてきました。ほとんどすべてのお店が卸売で、リールのLEDがごろごろと・・・規模では秋葉原の何十倍くらいの印象で、驚きでした。
はてなブログへ引っ越ししてきた
中国へ引っ越ししたのを機に、ブログもはてなブログへ引っ越しをします。
引越しの理由:
1. 中国ではアクセス規制がされているドメインがある。たとえば政府と衝突したGoogleのblogspot, ヤバイ動画コンテンツが多いせいかFC2ドメインのサイトは企業サイトから個人サイトまで全くアクセスができない。うちのサイトのドメインもこれに当てはまっているようで、表示が全くできない。Twitter, Youtube, Facebookも同じ。
2. 表示ができても、謎のファイアウォールのせいなのかウェブサイトの表示速度が遅くなることがある。
3. 海外からの更新ができないブログがある。アメブロなど。
4. さいしょはLivedoorブログを試したのですが、Wordpressからインポート機能があるのですがこれが全然使えなかったので、あきらめました。Wordpressからはてなブログへは、こちらのサイトを参考に、簡単にできました。
ここでは中国に住んでみて気づいたことを綴っていこうと思います。また、まだ使える記事は引っ越しをしながら、ガジェット記事なども書いていくつもりです。