jwata blog

勉強の記録や思ったことなど

Word2vecでセマンティックジョブ検索

概要

前回は求人情報に含まれる単語をWord2vecで学習し、職種名やスキルの類似単語を取得できることを確認しました。

今回はそれらの類似単語を活用して、Elasticsearchでセマンティック検索をするデモを紹介します。

求人情報サイトでは、検索クエリの職種名やスキル名にマッチする案件を見つけることが難しく、 これは似ているけど違う職種名やスキルの単語や表記揺れがたくさんあるからと考えられます。

セマンティック検索

求人情報サイトでは、検索クエリの職種名やスキル名にマッチする案件を見つけることが難しく、 これは似ているけど違う職種名やスキルの単語や表記揺れがたくさんあるからと考えられます。

今回のデモではElasticsearchのSynonym Token Filterを利用し、検索クエリに類似単語を追加しよりたくさんの関連した検索結果を見つけることを目指します。

image.png

同義語ファイルの作成

学習済みのword2vecのモデルから、各単語の類似語5つずつを取得し、同義語ファイルを作成します。

同義語ファイルの例

# synonym.txt
...
データサイエンティスト=>データ サイエンティスト,データ サイエンス,データ マイニング,データ アナリスト,機械 学習
機械学習=>機械 学習,自然 言語 処理,データ マイニング,マイニング,統計 学
...

Elasticsearch mapping

デモの為に、Synonym Token Filterを検索クエリに適用したインデックスと通常の日本語検索インデックスを用意します。

通常の検索インデックス

# jp_mapping.json
{
  "mappings": {
    "_doc": {
      "dynamic_templates": [{
        "texts": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "analyzer": "kuromoji",
            "search_analyzer": "kuromoji"
          }
        }
      }]
    }
  }
}
curl -XPUT -H "Content-Type: application/json" \ 
   localhost:9200/job_postings -d @jp_mapping.json

セマンティック検索インデックス

# jp_semantic_mapping.json
{
  "settings": {
    "index" : {
      "analysis" : {
        "analyzer" : {
          "synonym" : {
            "tokenizer": "whitespace",
            "filter" : ["synonym"]
          }
        },
        "filter" : {
          "synonym" : {
            "type" : "synonym",
            "synonyms_path" : "analysis/synonym.txt" # 用意した同義語定義ファイル 
          }
        }
      }
    }
  },
  "mappings": {
    "_doc": {
      "dynamic_templates": [{
        "texts": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "text",
            "analyzer": "kuromoji",
            "search_analyzer": "synonym"
          }
        }
      }]
    }
  }
}
curl -XPUT -H "Content-Type: application/json" \ 
   localhost:9200/job_postings_semantic -d @jp_semantic_mapping.json

データインサート

用意した2種類のインデックスに、同じ求職情報セットをインサートしていきます。 このデータは前回の記事でword2vecの学習に利用したものになります。

結果

それではKibanaで結果を見ていきましょう。

通常の検索 セマンティック検索
image.png image.png

通常の検索結果では該当する単語にマッチする求職情報のみが表示せれています。 一方でセマンティック検索の結果では類似語にマッチした求職情報も表示され6倍ほどの件数がヒットしました。

考察・まとめ

今回は簡単の為にSynonym token filterを利用し、通常の求人情報検索を改善することが出来ました。 この手法は、採用側が候補者を検索する際にも有用だと考えられます。

ただ実際のプロダクトに組み込む為には、単語の類似度を考慮した独自の検索スコアを考えたり、それを検索のロジックに組み込んだりといった必要がありそうです。

最後まで読んで頂きありがとうございます。 word2vecの応用例として参考になれば幸いです。

参考

DiceTech ConceptualSearch Diceという海外の求人サイトでは、類似度を検索スコアに反映したより実践的なテクニックを紹介していましす。