最近言語系の機械学習を少し触っている。以前に備忘の意味も含めて少しまとめてみた。
今回はこの続きで、Transformers系、具体的にはBERTを用いてSemantic検索をやってみたいと思った。Semantic検索とは、検索ワードそのものでなくともそれに近い単語で検索してくれるようなものだ。Googleで検索するときには既にSemantic検索になっているが、これを自分でも作れないかということを試してみた。
Transformersも最近は色々派生種が出ていて、その中でSentence Transformersというものも使えるようになっている。Sentence Transformersというのは、単語ではなく文章単位で特徴量を抽出するような仕組みになっている。
とは言え、一から作るのは大変なのでまずはSentence Transformersを日本語で適用した事例、特にPythonのコードを公開しているサイトを探してみた。幾つかを見つけることができたが、いずれもSentence Transformersを用いて分類をやってみました、というものでSemantic検索ではない。分類をやる分には大いに参考になりそうなので、下に事例を示す。

そもそもSentence Transformersは分類に向いている、と記載されているサイトもあり、Semantic検索には使えないのかなあ? と思いつつ英語で検索すると英語ではSentence TransformersでSemantic検索した事例がいくつかあった。これも下に事例を示す。
見つけたものはどちらもSentence TransformersとFaissの両方を使用してSemantic検索をしようとするものだった。Faissというのは、Meta(Facebook)社が提供している近傍探索のライブラリである。考え方として、下の図のように質問文(Search Query)のベクトル化、あるいはデータベースの文章のベクトル化にBERT、Sentence Transformers等を用いて、ベクトル間の近似性はFaissで行う、と言っているように見える。文章系の機械学習経験は3ヶ月ほどなので理解が間違っているかもしれないが。

用いるモデルも英語のものにはなるものの、とりあえずこのサイトを参考にするとSentence Transformersを用いたSemantic検索のPythonコードを書くことはできた。このコードで日本語を処理してみると、何故かそれなりの結果が帰ってきた。まだどこまでの精度であるかは検証していないし、日本語のモデルに入れ替えるともっと良い結果が得られるかもしれないが、それは今後おいおいやっていこうかと思う。機械学習について調べようとすると、英語で検索した方が良いというのは以前も経験したが、やはりこの分野では日本は裾野が狭いのだろう。日本語の特異性というのもあるのかもしれない。
#SentenceTransformers #Semantic検索 #BERT

コメント