春山 征吾のくけー

https://www.unixuser.org/~haruyama/blog/ に移転しました http://wiki.livedoor.jp/haruyama_seigo/d/FrontPage @haruyama タイトルが思いつかないときはそのときかかってた曲をタイトルにしています.

@ haruyama と飲む会 を 2012/10/03 に開催します.

今回は全額出そうと思ってましたが, 多くの人がカンパしてくれるようです.

2012/05/29 に @ haruyama と飲む会を開催します

2012/05/29 に @ haruyama と飲む会を開催します.

@ haruyama と飲む会 2012/05/29

これまでに2回開催しました.

@ haruyama と飲む会 2011/11/09

集まって適当な話をするだけの会です. mixi の施設を利用するのでコストは低めでやれます.

Solr の FunctionQuery を増やしてみた.

今後, Solr においてランキングを外部から挿入したいという話が増えると考えています. たとえば, 検索した人に近い人を上位に出したいという場合です.

Solr 3.1 からは FunctionQuery - Solr Wiki がソートに利用できます. ここで, dist_between_users(id1,id2) という 2者間の距離を求める独自の FunctionQuery を追加してみました.

users となっていますが, 別にユーザ間である必要はありません.

  • ユーザid:1 と他のユーザとの距離でソートするクエリ
    • q=*:*&sort=dist_between_users(1,id) desc
  • さらにスコアとして距離を表示するクエリ
    • q=_val_:"dist_between_users(1,id)"&fl=*,score&sort=dist_between_users(1,id) desc

組込み方はこんな感じです.

solrconfig.xml に以下の記述を追加します.

  <valueSourceParser name="dist_between_users" class="org.unixuser.haruyama.solr.search.function.DistBetweenUsersParser">
  </valueSourceParser>

以下の3つのクラスで構成されています.

DistBetweenUsersParser が入力を DistBetweenUsersFloatFunction に渡します.

class DistBetweenUsersParser extends ValueSourceParser {

  // In actual environments, you would set parameters of storage.
  //override def init(args : NamedList[String]) { }

  override def parse(fp :FunctionQParser) : ValueSource = {
    val sources = fp.parseValueSourceList();

    return new DistBetweenUsersFloatFunction(sources.toArray(new Array[ValueSource](sources.size)))
  }
}

DistBetweenUsersFloatFunction が入力を処理して結果を返します.

class DistBetweenUsersFloatFunction(sources : Array[ValueSource]) extends MultiFloatFunction(sources) {

  override protected def name() : String = "dist_between_users"

  override protected def func(doc : Int, valsArr : Array[DocValues]) : Float = {

    require(valsArr.length == 2, "dist_between_users needs 2 arguments, but " + valsArr.length + " argument(s).")

    val first = valsArr(0).intVal(doc)
    val second = valsArr(1).intVal(doc)

    DistBetweenUsersStorage.get(first, second)
  }
}

DistBetweenUsersStorage は本当は外部のストレージに問合せることにになりますが, ここでは手を抜いています.

object DistBetweenUsersStorage {
  private val distMap = Map("1,2" -> 1.0f, "1,3" -> 2.0f)

  def get(first: Int, second : Int) : Float = {

    if (first == second) {
      return Float.MinValue
    }

    distMap.getOrElse("%d,%d".format(math.min(first, second), math.max(first, second)), 0.0f)
  }
}

テストはありません. テストを書くなら Java で書いて solr/core/src/test/org/apache/solr/search/function/TestFunctionQuery.java をコピペしたテストを書いたほうが楽そうです.

2012/04/13 Anuenue 0.7.5 リリース

2012/04/13 anuenue-wrapper 0.7.5 をリリースしました.

Apache Solr 3.6.0 と lucene-gosen 2.0.0 への対応を行ないました.

#LUCENE-3305 Kuromoji code donation - a new Japanese morphological analyzer - ASF JIRA と それに伴なう lucene-gosen のクラス名変更のため, lucene-gosen を利用している場合, 既存の schema.xml との互換性がありません.

会社のマシンで適当なベンチマークをした結果をTwitterに書きました.

2011/05 の計測 ( Solr/Tokenizer評価201105) ) に比べると だいぶ kuromoji の性能があがったようにみえます.

Anuenue 0.7.3 リリースと 0.7.4 リリース予告

Anuenue 0.7.3 をリリースしました. mixi 社内での管理のためにシェルスクリプトに機能を追加しています.

そして Anuenue 0.7.4 をリリース予定です. java.io.FileReader を利用していたために, TSV ファイルの読み込みが locale に依存してしまい, 正しい文書が更新されない場合がありました. たとえば locale が 設定されていないと更新に高い確率で失敗します.

0.7.4 では FileReader は利用せず, java.io.FileInputStream と java.io.InputStreamReader を用いて, ava.io.InputStreamReader で UTF-8 encoding を強制することでこの問題をなくします.

今日明日でテストを行ない問題がなければリリースします.

テスト環境では *.UTF-8 がLC_ALLなどに設定されていたためこの問題に気付きませんでした. locale について指定していない cron からのコマンド呼び出しで問題があることがわかりました.

2012/03/22-2012/03/25

2012/03/22 夜サッカーした.

2012/03/23 会社の納会で飯をくいまくった. 次の日にサッカーをするので酒は飲まなかった.

2012/03/24 サッカーした. 1-1(0-1, 1-0) で引き分け. グラウンドに大きなみずたまりが何箇所もあって, サッカーするべきではない状態だった. 後半のみ出場. グラウンド状況に関係ない部分でもプレーはだめだめだった.

2012/03/25 サッカーした. 0-0 で引き分け. 後半のみ出場. けっこううまく守れた.

24日と25日ではチームが違う. サッカーのレベルは似たようなものなのに, 24日のチームだといいプレーができないが, 25日のチームではそれなりにプレーできる.

日本語入力を支える技術 ―変わり続けるコンピュータと言葉の世界 のサンプルコードの学習の部分にバグがある.

「graph != result」 となっている2箇所は 「sentence!= result」でないとおかしい.

ただし, 効率が悪くなるがほとんど結果には影響しないはず.

徳永さんには連絡済み.

今週も週4日サッカーする予定.

2012/03/13 - 2012/03/21

今後は何日分かまとめて記述するようにしよう.

2012/03/13 と 2012/03/15 の夜サッカーした.

2012/03/16 までは業務でポジネガ分析用の辞書(形容詞と絵文字と顔文字)を作っていた. 既存の辞書を用いて教師データを作りシンプルな分類器で分類したものを目で精査して新しい辞書を作成, というのを何度も繰り返したところなかなかいい感じの辞書ができた.

2012/03/18 はサッカーの試合. 先制されたが追い付いた. 1本コーナーキックからシュートしたが枠外. 順位を決めるための PK 戦で勝利. 私は蹴らなかった.

2012/03/19 は夜サッカー. SICP 読書会は, 参加率が悪かったのでもともと中止の予定だった.

2012/03/20 haruyama/ime-sample ・ GitHub に, 学習のコードを足してみた. SVM にはまだ手を付けてなくて パーセプトロンのみ.

哲学が異なる言語間で移植するとなかなか面白い.

徳永さんのサンプルコード(ruby) の中の以下のメソッドを

  def convert_to_nodes(sentence)
    ret = []
    bos = Node.new("", "", 0)
    ret.push bos
    i = 0
    prev = bos

    sentence.each{|x|
      i += x[1].length
      node = Node.new(x[0], x[1], i)
      node.prev = prev
      ret.push node
      prev = node
    }

    eos = Node.new("", "", i+1)
    eos.prev = prev
    ret.push eos

    return ret
  end

私は Clojure で以下のように書いた.

        (fn [sentence]
          (defn- iter [sen ret prev i]
            (if (empty? sen)
              (let [
                    eos (node/make "" "" (+ i 1))
                    ]
                ((eos :set_prev!) prev)
                (conj ret eos))
              (let [
                    x (first sen)
                    j (+ i (count (second x)))
                    node (node/make (first x) (second x) j)
                    ]
                ((node :set_prev!) prev)
                (recur (rest sen) (conj ret node) node j))))
          (let [
                bos (node/make "" "" 0)
                ]
            (iter sentence [bos] bos 0)))

2012/03/21 明日会社の勉強会で統計の教科書の内容をまとめた物を発表するための資料作り.

2012/03/12 When You Reach Me を読了

2012/03/12 When You Reach Me(Rebecca Stand) を読了. この落ちはあまり好きじゃない.

SICP読書会を開催. 今日はそれほど難しくなかったかな? その後反省会を2時間ほど.

はてなは 2004年の事件で登録をやめて, その後は閲覧者としてしか関わっていない.

はてなへの住所登録の義務化撤回について

2004年のときの対応は私は良く思わなかった. だいぶ前の話なのでしっかり覚えているわけではないが.

今日はテキストマイニングの真似事をした. 精度をあげるには結局地道な努力が必要そうだ.

2012/03/10 サッカー中止 2012/03/11 うさぎドロップ 9.5 10 を購入

2012/03/10 サッカーがグラウンド不良で中止に. 家事をして英語の勉強をして酒飲んで寝た.

2012/03/11 うさぎドロップ 9.5 と 10 を購入. 9.5 のほうは買わなくてもよかった.

When You Reach Me (Rebecca Stead) を 3/4 くらい読んだ. 最初は散漫な話だなと思ったが中盤からは面白くなってきた.

2011/03/08 サッカーした 2011/03/09 特記事項なし

2011/03/08 サッカーした. 姿勢を良くしてプレーすることをこころがけたら少しミスが減った感じ.

昼は 私的勉強会と学会の未来_第74回全国大会イベント企画 を仕事をしながら聞いていた.

2011/03/09 ふつうに仕事した.

はてブのfeedの購読をやめて, 家では はてブとNaverはブラウザでブロックして見ないようにした.

はてダは書いている知人がいるし, NHN に範囲を広げるとこのブログも引っ越さないといけないし, ということでとりあえず上の範囲にした.

NHN や Livedoorは去年面接に行ったけど Naver は合わないだろうなと思って行かなかった.

QRコード
QRコード
  • ライブドアブログ