require されるもの, mdb tools, systemd, nokogiri, nlp on postgres, density in gnuplot (2016/02/18)


require

require したときどっから何が読み込まれてるねん? ってまえからずっと気になってたんですが, 変数

$"

にはいってました.

emacs japanese input

ずっとsystemから提供されている入力メソッドを使っていたのですが, 入力中に消えてしまうなど, どうにも具合が悪く, 一方ibus-elは動かなくなってて, いろいろ試行錯誤した結果, anthy-el を使うことにしました. でもいまいちなのでもっと良いのが欲しいです.

その後,普通にibusをそのまま使うことにした.他のアプリケーションとキー割り当てが同じなのがいい.

2015/07/03

時代は rbenvとpryとbundlerらしい.

mdb tools

仕事で microsoft access のデータを扱うことがあって, なんとかして csv のデータを取り出せないものか, と思ったら yaegashi さんに教わった.

こんな感じで使うぽい

for tb in `mdb-tables DB_FILE`
do                      
mdb-export DB_FILE $tb > $tb.csv
done

コマンド mdb-export がCSVへexportしてくれるんだけど, テーブル名を指定しなきゃいけなくて, どんなテーブルがあるかは, mdb-tables で調べられる(shell scriptで回すのにやりやすい感じに出力してくれる)

systemd にサービス追加

むっちにききました. update-rc.d というコマンドを使えば, 適宜よきにはからってスクリプトを runlevel ごとのフォルダにリンクを追加してくれます. 以下手順です.

これで動けばよいが, 何か間違っていて動かない場合もあると思う.

これでlogがみれるので, それを見て間違いを直す. なおしたら

して様子をみる. 動いてなければ

に戻る. 動いていれば, 万歳だ. これで起動時に自動で動くようになるはず.

マークアップされたファイルのパーザとハンドラです.非常に高速かつ強力.以前一瞬使おうと思ったけど意味が解らなくて諦めたんだけど,今回仕事でどうしても避けられないので根性きめて調べたらそんな難しくなかった.以前はなぜ諦めたのだろう?

だいたい必要なことは本家のチュートリアルこのブログで足りてる.

これを使って何を作ったのかというと,wikipediaの対応する項目を使って言語をまたいだ対訳を行うというコードです.

つまり,左側に他言語の記事,というのがリストされてますが,そこを漁って,いまみてる項目名と他の言語の項目名の対訳関係をピックアップするというだけのコードです.使い方はこんな感じ.

"Wahrheit".translate(src:"de", dst:'ja')
"真理"
"上を向いて歩こう".translate(dst:"en", src:"ja")
"Sukiyaki (song)"
"ヒルベルト".translate
"David Hilbert"
"機動戦士ガンダム".translate(src:"ja", dst:"en")
"Mobile Suit Gundam"

で,中身ですがこんな感じです.

  def translate(arg={})
    require "uri"
    require "open-uri"
    require "nokogiri"
    src=(arg[:src] or "ja")
    dst=(arg[:dst] or "en")
    interwiki="interwiki-#{dst}"
    xpath='//li[@class="interlanguage-link ' + interwiki + '"]' ## 翻訳先のリンク
    str=URI::encode(self)
    begin
      doc=Nokogiri::HTML(open("https://#{src}.wikipedia.org/wiki/#{str}")) ##記事取得
    rescue OpenURI::HTTPError
      return nil
    end
    begin
      URI::decode(doc.xpath(xpath).children.first.attributes["href"].value.gsub("//#{dst}.wikipedia.org/wiki/", "")).gsub('_', ' ') ##記事をparseして訳語取得
    rescue NoMethodError
      return nil
    end
  end

記事さえあればどの言語からどの言語へも,翻訳可能というのが異常に便利です.ドイツ語をラテン語に翻訳できたりすることがあります.うひょー.それから,固有名詞などに滅法強いです.(が,一般名詞には弱いです).

postgresqlで自然言語処理

n-gramベースの自然言語処理がいけます。mysqlのmyisamで使えるのとわりと共通してる感じですね。

debian だと postgresql-contrib をインストールすれば全部まとめて入るもののなかにこれも入ってます.

create extension して create index しておくと,文字列類似度に基づく検索がわりと高速にできるようになります.こんなsqlが発行できるようになるのです.

select * from table where column % 'string';

このクエリは類似スコアを使った閾値で切ってくるので,閾値は

select show_limit();

で値を確認して

select set_limit(0.5);

みたいなかんじで値を変更してください.類似度のスコアは

select similarity(text0, text1);

で確認できます. 当然ですが綴りミスや略語なんかも拾ってくれます.あらかじめ枝を十分に刈り込んでから実行すれば,めんどくさい自然言語処理がsqlで完結するので最高です.丸投げです.

gnuplotting with kernel density

だいたい累積分布で間に合ってますが,稀によくあることですが異常な分布にでくわしたときは,確率密度も見たくなります.

いろんな方法があると思いますが,とりあえず見るだけならgnuplotが適当によきにはからってくれます.

plot 'data-file' using 1:2:(1.0) smooth kdensity

こんな具合です. kernel density 推定法というのを使って密度関数をデータから適当に推定して微分可能曲線で描いてくれます.可視化だけじゃなくデータ処理もやってくれるgnuplotさんマジで最強っすね.

gnome-terminal

ここ数年問題を起こしてないので愛用しているgnome-terminalですが,最近発見した小技.

multi tabで窓の中に多数のシェルを起動できるのはお馴染みですな.これをdragしていけば隣のterminal窓にそのシェルを引っ張っていけるのもおなじみだと思います.

引っ張っていく途中で手を放してしまったら,そこで新しい窓になります.こうやってtabから独立した窓に出世するのもアリです.

だけど,独立した窓になってしまったら,また元に戻したいときにどうすりゃええの?

じつはこれも可能ですが,若干,美しくないんですね.新しい窓で新たにtabを生やせば戻したいシェルがdragできるようになるので,それを使って戻します.残った窓を閉じます.

んー tab を戻すためだけにシェルがひとつ起動され,用もないまま終了されているのは,はげしく納得できないのですが一応は可能ということです.


記事リストへ