日記lucene-gosen、solrなど。あと、興味のあること。http://blog.johtani.info新ブログを立ち上げました。http://blog.johtani.infoこちらも御覧ください。Mondaylucene-gosen4.3.0をリリースしました。4.3.0をリリースしました。4.2.1以下のバージョンのLucene/Solrでは利用できません。4.3.0では動作しませんので注意が必要です。4.3.0でのみ利用できます。これは、先日のエントリにも書きましたが、LuceneにてAPIの変更が行われたためとなります。いくつかのクラスおよびメソッドが廃止されたため、下位互換が保てない変更が入っているためです。独自のTokenizerやTokenizerFactory、TokenFilterFactory、CharFilterFactoryを作成されている方は、Lucene/Solrのバージョンアップを行う際は注意が必要です。4.0.0リリースついに、Lucene/Solr4.0.0がリリースされました。MLで流れていましたが、3年越しのリリースだったようです。コミッターの方々、JIRAにバグ報告をした方々、お疲れ様でした。いうことで、ちょっと忙しくなりそうです。4.0の機能を調べたりもしたいですし、すこしずつ紹介もしたいです。本家サイトのニュースはこちらlucene-gosenの4.0対応版についてlucene-gosenも4.0正式版のjarを利用したバージョンを公開する予定です。branches/4xでは、すでに作業を行なっており、jarファイルの差し替えは終了しています。お急ぎの方は、branches/4xをエクスポートして、ビルドしていただくと利用可能となっています。Lucene/Solrのバージョンが上がっているため、lucene-gosenのメジャーバージョンも変更し、lucene-gosen-4.0.0としてリリースする予定ですしました。(順当に行けば、3.0.0ですが、Luceneのメジャーバージョンに合わせたほうがわかりやすいかと思いまして。)また、現在、trunkが3.6.x対応のソースになっていますが、このあと、現在のbranches/4xのソースをtrunkにする予定です。3.6.x対応のlucene-gosenについては、branches/lucene-gosen-rel2.0にて作業を行うこととなります。今後は注意してチェックアウトするようにお願いいたします。いうことで、ダウンロードできるようにしました。4.0.0に対応したライブラリになります。Thursdaylucene-gosenのLucene/Solr4.0-ALPHA対応Lucene/Solrの4.0.0-ALPHAが7/3にリリースされました。これに伴い、lucene-goenの4xブランチのjarファイルも4.0-ALPHAのものに置き換え、現在のtrunkの修正もマージしました。チェックアウトしてビルドしてから利用してください。※さすがに、jarをダウンロードできるようにすべきかもなぁ。あと、Maven登録も。32で上がってきたlucee-gosenのUniDic対応の最初のパッチを書いたので、ブログに残しておきます。UniDicとはUniDicとは、日本語テキストを単語に分割し,形態論情報を付与するための電子化辞書です。UniDicの詳細や特長についてはHPを御覧ください。残念ながら、UniDicは利用者登録をして、利用規約に従うと利用が可能となります。lucene-gosenでは、Ipadicやnaist-chasenの辞書とは異なり自動で辞書をダウンロードする機能はありません。以下が、Unidicの辞書を利用したjarファイルの作成方法となります。lucene-gosenをダウンロードし、パッチを当てるlucene-gosenのリポジトリからソースをエクスポートし、パッチをダウンロードし、パッチを適用します。コマンドは以下のとおりです。...patch(パッチに関しては今後正式版をリリースされたら手順からは必要なくなります。対象となるUnidicの辞書のソースファイルをダウンロード利用者登録をし、利用規約に同意の上、以下のファイルをダウンロードします。「/」に添ってダウンロードページから遷移してダウンロードしてください。-Ddictype=unidic成功すれば、lucene-gosen-trunk-readonly/dist/lucene-gosen-2.1-dev-unidic.jarファイルが生成されます。あとは、通常通り、SolrやLuceneで利用することが可能です。以上がjarファイルの作成手順となります。制約事項(2012/06/18現在)現在(2012/06/18)時点で公開しているパッチは、以下の制約が存在します。品詞情報(発音)の内容の制限COMPOUNDエントリー未対応Unidicの辞書のエントリーの中に1件だけ、COMPOUNDと呼ばれるエントリーが1件だけ存在します。別々の単語を組み合わせて1単語として扱うことができるようになっているようです。lucene-gosenでは、残念ながら、このような辞書の形式には対応していません。1件しか存在しないデータでもあることを鑑みて、今回の辞書構築処理では、スキップするようにしました。品詞情報(発音)の内容の制限lucene-gosenの実装上、単語の読みのバリエーション数と発音のバリエーション数には以下の制限が存在します。「読み」に対応する形で、「発音」がlucene-gosenでは品詞情報としてデータ登録されています。UniDicのデータには上記制約を満たさないデータが5件ほど存在します。現在、これら5件のデータについて、「読み」に対応した「発音」データには空文字が表示されるようになっています。簡単に動作確認をしただけです。UniDicを利用していて問題など有りましたら連絡、Issueへのアップをしていただけると助かります。2.0.2リリース(リソース周りの改善など)lucene-gosenの最新版(2.0.1)をリリースしました。プロジェクトページよりダウンロードが可能です。さんからいただいていたパッチの取り込み(リソース周りの改善など)が主な対応となっています。コンパイルに利用するjarファイルがLucene/Solr3.6.0に変更になっています。(Issueはこちら)3.6.0から追加されたテストケースにて、発生する問題への対処も施したものとなっています。WednesdayIssue32について(4096の壁)昨晩に引き続き、情けない内容のブログになってしまいますが。昨晩、書いた記事の調査をしていた時に気づいた、問題になるケースがあったので調査をしていました。Issue32に登録した内容になります。拙い英語を振り絞って書いた英語なので、伝わらないかもしれないのでブログに残しておきます。昨晩の問題点となったクラス(StreamTagger2.java)の内部処理についてです。入力文字列をReaderから読み込むときにバッファリングしています。このバッファリングにて、特定のケースにて、想定していない場所を単語の切れ目と認識してしまう問題が実装上存在しました。Issue32に記載した内容は次のようになります。上記バッファは4096文字というサイズで固定になっています。StreamTagger2クラスでは、この4096文字をオーバーするような文字列の場合に、つぎの処理により、4096文字以下の場所に文章の区切りを探そうとします。4096文字以上の文字列が入力されるバッファに入れられるだけの文字(4096文字)をバッファにコピーする。バッファの後ろから、つぎの5種類の文字を探索し、見つかった場合(場所をkとし、k>0の場合)は、その場所を文章の切れ目と判定して、0からk+1文字目までの文字をStringTaggerを利用して形態素解析する。あとは、繰り返し上記条件に合致しない場合は、4096文字を文章とみなして形態素解析を行います。ここで、5種類の文字は以下のとおり。SEPARATOR見ての通り、制御文字ばかりです。この5文字以外は切れ目と判断してくれません。いうことで、4097文字の文字列が存在し、上記5種類の文字が一度も出てこない場合、バッファのサイズで文字列が途切れてしまい、想定しない区切り位置で区切られた文章に対して形態素解析が実行されてしまいます.HTMLから文字列を抜き出して解析したり、長い文書を解析する場合に、改行文字を削除して処理するといったことも考えられます。上記5種類の文字列のみで文章の区切り位置を判断してしまうのは問題ではないかと。」句点が存在した場合に、その部分を区切り位置として認識するようなパッチを記載して、Issue32に添付しました。」句点を採用した理由はつぎのとおりです。StreamTagger2では、上記バッファリングした文字列を更に、BreakIterator.getSentenceIterator(Locale.JAPANESE)にて取得したBreakIteratorにて文節単位に区切ってから、各文節ごとに形態素解析を実施しています。いうことは、BraekIteratorにて分節の区切りとして判断される文字については、上記の文字種に追加しても問題無いという判断からです。この修正でも、純粋に4096文字以上、句点が出てこない場合には区切り位置がおかしなことになってしまいますが。BreakIteratorの挙動を調べて、他にも利用可能な区切り文字が存在しないかを調査していく予定です。1年以上コミッターをやっているのに、こんなことも理解していないのかよいうツッコミを受けてしまいそうでなんとも情けない話です。Tuesdaytrunkのライブラリ差し替え(Lucene/Solr3.6.0)とランダムテストの失敗について久々にlucene-gosenを触っています。trunkのlibにある、jarファイルが3.5ベースだったので、3.6ベースにしてテストをしたところ、いくつかある、ランダムテストで結果の不整合が検出されたので、調査していました。先程、trunkに対応版をコミットしました。テストケースを追加してからリリースします。通常の使い方では問題無いと思います。Luceneでは、ランダムな文字列を利用したテストが実装されています。lucene-gosenでもこのテストを利用してランダムなテストをしています。実際にはtest/以下のorg.apache.luceneパッケージにテストケースがあります。今回、jarファイルを差し替えた時に、このランダムなテスト実施にて、assertが失敗するケースが発生しました。原因究明までに、いくつかフェーズがあったので、忘れないように書いておきます。※ただし、成功する場合もあり。2.該当のテストを再現しつつデバッグ+該当のテストがどんなものかを解読(勉強不足。)※テストは、失敗した場合につぎのようなメッセージが表示され、同じテストが再現可能です。以下、エラーの出力例。」のあとにあるantコマンドを実行すれば、同じテストが再現可能です。ERROR3.デバッグの結果、Luceneのtest-frameworkにある「MockReaderWrapper」というクラスの影響を確認LuceneのJIRAのLUCENE-3894にて追加されたクラスであるとわかる。このクラス、Readerのreadメソッド内部で、ランダムな値を元に長さを途中で返すという実装のReaderになっている。(全部で18文字の文字列なのだが、ランダムな値を元に、12文字として結果を一旦返すという仕組みが実装されている)4.lucene-gosenの問題箇所を特定。Readerが途切れた部分を分節として扱ってしまう実装になっていた。該当の部分に修正をいれてコミット。一応、テストを数回走らせてランダムテストが問題なく終了するのを確認はしてあります。今回の問題に対する、個別のテストケースを追加してから近日中リリースする予定です。対応が遅くなって申し訳ないです。2.0.1リリース(Java7対応)lucene-gosenの最新版(2.0.1)をリリースしました。プロジェクトページよりダウンロードが可能です。今回の修正では、Java7でUnicodeのバージョン変更に伴う対応(詳細はこちらを参照)を行なっています。リソース周りの対応はまた後日。先日、2.0.0リリースの記事にも記載しましたが、Java7でテストケースが失敗する問題がありました。@haruyamaさんと@hideaki_tさんの協力により問題を解消し、trunkと4xブランチにコミットしました。issueにも記載しましたが、Java6からJava7にバージョンアップするタイミングで変更されたUnicodeのバージョンが原因でした。Java6ではUnicodeのバージョンが4.0です。Java7ではUnicodeのバージョンが6.0に変更されています。今回の問題は「・」(0x30FB)の文字列のCharacter.getType()がCONNECTOR_PUNCTUATIONからOTHER_PUNCTUATIONに変更されたのが原因です。c)メソッドで行なっています。修正前は、ここで、charの範囲が0x30A0〜0x30FFにある文字でかつ、Character.getType()がCONNECTOR_PUNCTUATIONでないものがカタカナとして判別されていました。issueの添付ファイルにJava6とJava7で上記範囲の文字のCharacter.getType()のリストを生成して、該当する文字を探した所、「・」(0x30FB)のみであることがわかりました。いうことで、このコードの意図としては、「・」はカタカナではないと判別したかったのだと。上記の確認を行えたので、ソースコードを修正してコミットしました。2.0.1としてリリースするかは、Issue29のボリュームを見て考えますので、もう少しお待ちください。2.0.0をリリースしました。3.6.0のリリースを待つつもりだったのですが、なかなか出ないので先にリリースを行いました。現時点では、branches/4xについては、パッケージ名、クラス名の修正が追いついていません。明日までに4xブランチについても修正を反映する予定です。参考までに、1.2.1から2.0.0への変更点について以下にまとめました。変更に伴い、Solrのschema.xmlに記述するクラス名も変更になります。schema.xmlのサンプルについてはこちらをご覧下さい。変更点まずは、パッケージ名の変更点です。左が旧パッケージ名、右が新パッケージ名となります。org.apache.lucene.analysis.gosen.tokenAttributesまた、パッケージ名とは別に、以下のクラス名も変更になっています。org.apache.lucene.analysis.gosenのクラス名の変更点です。GosenWidthFilter.java次はorg.apache.solr.analysisです。GosenWidthFilterFactory.javaまた、上記クラスに関連するテストクラスの名前も変更になっています。以上がクラス名、パッケージ名の対応に関する修正ついてでした。現在、Java7にてテストケースが失敗する問題が見つかっています。こちらの問題の対応版についても近日中にリリースを行う予定です。問題点、質問などありましたら、コメントしていただくと回答いたします。忘れてました、すみません。今回のリリースで、以下の機能が追加されています。Antのパラメータにproxy.user、proxy.passwordの追加GosenReadingsFormFilterの追加TokenAttributeの修正(PronunciationsAttributeImpl、ReadingsAttributeImpl)Antは認証が必要なプロキシ環境で辞書のビルドを実施するときにユーザ名、パスワードを指定できるようにしました。GosenReadingsFormFilterは単語を読みに変換するTokenFilterになります。よみは、辞書に登録してある読みになります。オプションとして、romanizedが指定可能です。指定をすると、よみをローマ字に変換します。TokenAttributeの修正は、バグフィックスになります。Issueはこちらです。4系に対応した改訂版を出しました!興味ある方はぜひ。COMMENTポモドーロ回してます。policyが気になったので訳してみた。