Skip to content

Java (Scala) で言語判定

Java (Scala) で言語判定 published on Java (Scala) で言語判定 へのコメントはまだありません

やりたい事

  • Java (Scala) で、ある文字列が何語(日本語、英語、など)なのかを判別する
  • 入力文字列は以下の2通り
    • ユーザーから入力された検索文字列(1単語、数文字〜数単語、数十文字)
    • 検索対象となる文章(数十単語〜数十ページ程度)
  • 対応する言語
    • 当初は日本語と英語
    • 今後は5言語程度

なぜこれをやりたいかは、以下のエントリーを参照。

Elasticsearch多言語化その2 – K blog

Continue reading Java (Scala) で言語判定

Elasticsearch の nested 型のハイライト

Elasticsearch の nested 型のハイライト published on Elasticsearch の nested 型のハイライト へのコメントはまだありません

本投稿は、一つ前の「Elasticsearch多言語化その2」の補足。

ゴール

やりたい事は、以下のようなフィールドに対する検索結果のハイライトをすること。

  • nested 型で、中身は複数の “attachment” 型
  • attachment 型の “content” フィールドには、content.{ja,en,…} というサブフィールドを作成し、各言語毎の analyzer で処理する

マッピング定義は以下の通り。(elastic4s の DSL をそのままコピペしたが、まぁ大体理解してもらえるかと。)

val messageMapping = mapping("message").fields(
  "title_v3" typed StringType fields(
    "en" typed StringType analyzer "english",
    "ja" typed StringType analyzer "ja_kuromoji_neologd",
  ),
  "body_v3" typed StringType fields(
    "en" typed StringType analyzer "english",
    "ja" typed StringType analyzer "ja_kuromoji_neologd",
  ),
  "attached_files_v3" nested (
    "attached_file" typed AttachmentType fields (
      "content" typed StringType fields(
        "en" typed StringType analyzer "english" termVector ("with_positions_offsets") store (true),
        "ja" typed StringType analyzer "ja_kuromoji_neologd" termVector ("with_positions_offsets") store (true),
      )
    )
  ) includeInRoot (true)
)

環境は以下の通り

  • Elasticsearch 2.3.5
  • Elasticsearch Mapper Attachments プラグインを使用
  • elastic4s というライブラリ経由で Scala から使用

TL; DR

先に結論を書いておくと、以下の2つがうまくいった。

  • nested 型のフィールドに include_in_root を指定し、検索時には通常のクエリーを実行
  • 通常の nested 型のフィールドに対し、nested query を実行し、inner hits でハイライト対象フィールドを指定

どちらの場合も、 “term_vector”: “with_positions_offsets” と “store”: “true” は、attached_file.content.{ja,en} につける。

上手く行かなかったのは以下の方法。

  • nested query を実行し、highlight query でも nested query を実行

以下、詳細に説明していく。

Continue reading Elasticsearch の nested 型のハイライト

国際化

Elasticsearch多言語化その2

Elasticsearch多言語化その2 published on Elasticsearch多言語化その2 への2件のコメント

本投稿は、Elastic stack (Elasticsearch) Advent Calendar 2016 の2日目の記事かつ、以前書いた以下の投稿の続編。

背景等

以前書いた内容と重なる部分もあるが、背景等について説明しておく。

Elasticsearch を、各種開発者向けサービスの横串検索用に使用

GitHub, Slack, Google Drive 等のデータを API 経由で取ってきて、Elasticsearch に入れて、それを横串・一括検索出来るようなツールを作っている。元々は内部向けのツールだったが、ぼちぼち体裁等が整って来たので、現在β版的な感じでひっそり公開中。(今年中にはちゃんと公開したい。)

詳細はこちら → GitHub も、Slack も、まとめて検索 | Commet

検索対象の特性は、メイン言語+英語 or 英語のみ

開発チームまたはプロジェクトが1つの大きな単位で、そのチーム・プロジェクトで使っている GitHub のレポジトリ、Slack のチャンネル、Google Drive のフォルダを指定すると、その配下のデータが Commet 上に取り込まれる。

私の(そして、想定しているターゲット)のユースケースとしては、オフショアを利用していたり、メンバーが多国籍だったりする場合もあるが、使われている言語は、基本的には以下のどちらか。

  • メインとして使われている言語(日本語等)+英語
  • 英語オンリー

環境

  • Elasticsearch 2.3.5
  • elastic4s というライブラリ経由で Scala から使用

Continue reading Elasticsearch多言語化その2

stop-arret

Elasticsearch多言語化その1

Elasticsearch多言語化その1 published on Elasticsearch多言語化その1 へのコメントはまだありません

英語でもそこそこの検索結果が出て欲しい

以前、Elasticsearch の analyzer 関連の投稿を書いた。

Elasticsearch の analyzer 関連の設定で知ってることを全て書く

Elasticsearch を何に使っているかなどは、詳しくはそちらを参照してもらうとして、ポイントだけ抜粋しておく。

  • GitHub, Slack, Google Drive, ChatWork, Backlog などからAPI経由でデータを取ってきて、インデックスを作成
  • 言語は、日本語がメインだけど、海外の人とのやりとりや、英語のwebページ(StackOverflowとか)からのコピペもあるので、英語もある程度使われている。

現状は、日本語にのみ対応した設定だけど、英語もそこそこ使われているので、英語の検索結果もそれなりの精度になって欲しい、というのが今回の話。

やったこと: 英語の stemmer を filter として追加

先に結論を書いておくと、使用している analyzer に、”english” と “possessive_english” という2つの stemmer を filter のところに追加した。

設定方法などは、詳しくは以下のページを参照。

Stemmer Token Filter | Elasticsearch Reference [5.0] | Elastic

Continue reading Elasticsearch多言語化その1

国際化

i18n: 言語リソース名の命名規則

i18n: 言語リソース名の命名規則 published on i18n: 言語リソース名の命名規則 へのコメントはまだありません

テキストを多言語化する方法は大まかに2パターン

サイト・webサービスなどのテキストを多言語する方法はいくつかあって、詳細はググってもらうとして、(分類の仕方も色々あるけど)大雑把に以下の2つに分けられると思う。

  • gettext のように、ソースファイルに含まれる翻訳元言語(英語が多い)のテキストを _() や __() といった関数で囲んで、それを抽出して他言語のリソースを作成する
  • Java の ResourceBundle のように、任意の識別子(キー)と多言語対応が必要なテキスト(値)のペアからなるエントリーを含んだリソースファイルを各言語毎に作成し、それを使用する

(言葉で説明すると分かりにくいので、上の説明でピンとこない方は gettext, Java ResourceBundle などで検索してほしい。)

で、今回は後者に関して、キーの命名規則を自分達はこうしてるっていう話を書く。

ネットであまりベストプラクティス的なのが見当たらなかったので、とりあえず今やってる方法を晒して、他の人からの意見とかをもらって改善出来れば良いなあという意図。

Continue reading i18n: 言語リソース名の命名規則

symfonyでi18n

symfonyでi18n published on symfonyでi18n へのコメントはまだありません

基本的にはチュートリアルのi18nのに沿ってやったけど、やる順番は若干入れ替えてる。間違いとかがあれば指摘して下さいな。

環境:symfony 1.4.3

■settings.ymlの編集

settings.ymlに以下の記述をしてi18nを有効にする。

all:
.settings:
i18n: true

後は、デフォルトの"culture"をja_JPに設定。cultureはlocaleと同じようなものなのかな。

(5/23追記 )あと、i18nのヘルパーを使う設定をしておくと良い(standard_helpersの行)。

最終的なsettings.ymlの変更点は以下の通り。

all:
.settings:
i18n: true
default_culture: ja_JP
standard_helpers: [Partial, Cache, I18N]

charsetをutf-8に設定する、とも書いてあったけど、別にやらなくても良さそうなので今のところ放置中。 

Continue reading symfonyでi18n