pinecone-textを日本語に対応させる
こんにちは、システムゼウスの鈴木です。今回は、Pineconeが公式で提供しているハイブリッド検索用ライブラリ"pinecone-text"を日本語に対応させた方法をご紹介します。
pinecone-textを日本語対応させるには
pinecone-textは、Pineconeが提供しているライブラリで、疎密ベクトルを利用したハイブリッド検索をサポートしています。また、BM25Okapiアルゴリズムに基づいて疎ベクトルの生成も行うことができます。
生成時の大まかな処理フローは以下の通りです:
- 疎ベクトルの生成に必要な定数を算出する
- 疎ベクトルを生成したい文書または検索クエリを読み込む
- アルゴリズムに基づいて疎ベクトルを生成する
ここで、定数の算出や疎ベクトルの生成を行うためには文書を単語で分割する必要があるため、トークナイザーを利用して単語の分割を行っています。
しかし、pinecone-textで利用しているトークナイザーのサポート言語に日本語が含まれていないため、そのままでは日本語データの疎ベクトル生成を行うことはできませんでした。そこで、クラスを継承してサブクラスを作成し、日本語対応のトークナイザーに上書きすることで解決しました。トークナイザーとして、今回はjanomeを利用しています。janomeは日本語対応の形態素解析ライブラリで、日本語を単語ごとに分割してくれるツールです。Python環境で動作し、pipでインストールすることができます。
コード例
from janome.tokenizer import Tokenizer
from pinecone_text.sparse import BM25Encoder
# BM25Encoderクラスを継承
class BM25EncoderJP(BM25Encoder):
def __init__(self):
# BM25Encoderクラスを初期化
super().__init__()
# tokenizerをjanomeに上書き
self._tokenizer = Tokenizer(wakati=True).tokenize
# 実行例
from <filePath> import BM25EncoderJP
# 適当なコーパスを用意
corpus = [
"私は猫が好きです。",
"犬は忠実なペットです。",
"鳥は空を飛びます。",
"魚は水中で生活します。",
"猫と犬は人気のあるペットです。"
]
# インスタンスを作成
bm25 = BM25EncoderJP()
# 疎ベクトル生成のための定数を作成
bm25.fit(corpus)
# 検索クエリを疎ベクトル化
sparse_vector = bm25.encode_queries("空を飛ぶ動物は何ですか?")
形態素解析ライブラリの選定について
janomeを選択した理由としては、実装にあたって参考にした記事内でjanomeが採用されていたためなのですが、記事を書くにあたって調査したところMeCab,Vibratoの方が高速に動作するようなので、実装を行う際には他のライブラリの使用も検討するべきかもしれません。[1]
注意事項
今回紹介した方法は、オープンソースソフトウェア(OSS)を改変したものを含んでいます。改変された部分については、元のライセンス条件に従い、適切に使用してください。また、改変により生じた問題について、作者または著作権者は、契約行為、不法行為、またはそれ以外であろうと、ソフトウェアに起因または関連し、あるいはソフトウェアの使用またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。
おわりに
Pineconeでハイブリッド検索をするときに、pinecone-textが日本語に対応していないのがネックでしたが、対応させることができてよかったです。
Discussion