三枝明那か黛灰かクイズとか、クソおもろいよね めちゃくちゃすき
ところで最近faissという近傍探索ライブラリを使う機会があって、特徴量が似ているものをビャッと検索できることを知りました。L2ノルムもしくは内積を利用してベクトル間の距離を計算してくれるのですが、総当たり的に検索できるモードの他、クラスタリングを事前に行うことで大規模なデータに対しても高速な近傍探索を行うことができるモードが存在していてなんだかすごいです。
また、最近BERTなどで文埋め込みをする機会に恵まれており、これらをいい感じに使ったら似ている文章を検索出来たりするんじゃね?ということになりました。ヤッター!
殊更恵まれていることに研究室の先輩が大量のVのツイートを収集し続けていました。これに関しては何?てなるよな わかる
ということで、
Vtuber似てるツイート選手権を開催します!ウオオ!!
(今回の記事では開催していません)(は?)
いい感じのしょうもないオチで満足しちゃったので書かせて・・・
手順としてはこうです。
- 大量のVのツイートをいい感じのテキストデータにする
- 適当なモデルを利用してツイートたちの文埋め込みを取得する
- 取得した文埋め込みをfaissのインデックスに追加する(検索用のインデックス完成)
- クエリとなる文章の文埋め込みを取得
- さっき(3で)作ったインデックスで検索
Githubはこちら
環境構築はpoetryを使ってみました。普段はconda installとpip installを併用して地雷地帯で踊っています。(やめようね)
1.データの整形
先輩のデータきれいすぎてめちゃくちゃ楽でした。とりあえずライバーの名前と日付も保持してみたからいろんな遊び方できそう 楽しくね?
サロメさんのツイートをこねこねしていたら🏃\u200d♀️が🏃🏻♀️と等価なことが分かりました。肌色とか性別とかタグみたいな感じでついてておもろい。
2.文埋め込みの取得
[CLS]トークンの埋め込みを利用します。モデルは東北大BERTを使いました。文章の長さとかに結構影響受けている気がするから他のモデルでも結果比較したいと思ったりしています。いったんね?機械学習初心人なのでDataLoaderの作成とかそこら辺が大変でした。テキストたちをbatch_sizeごとにtokenizeしてモデルに突っ込みたいという至ってシンプルな感じを目指しています。
3.インデックスの作成とデータの追加
faissには2種類の距離計算方法と4種類のインデックスが用意されていて、用途に合わせて使い分けができます。が、まあ計算時間そんなにかからんし総当たりに内積計算するIndexFlatIPでええやろとしました。いったん、いったんね
ここにさっき取得した文埋め込みをぶち込みます。
4.クエリとなる文章の文埋め込みを取得
[CLS]トークンの埋め込みを利用します。こなれてきたわね。5.検索
topk個の類似度Dとラベル(展開順に0から降られているので実質インデックス)が帰ってきます。ラベル使ってデータセットからツイートを取得したら完了!きたわね。
やってみよ~
とりあえず壱百満天原サロメさんと、三枝明那さんのツイートをインデックスにぶち込んでみました。でたわね。
ツイートたちはこんな感じ


検索、していくど!
#input
text=ねむねむにゃんこ
#output
ねむねむにゃんこ
𓃬
𓃭
D: 0.94752604
おそろっち〜ん
D: 0.9392622
あ~ん❤😹😹
ねむねむにゃんこだしん🙀🙀🙀
D: 0.9291492
ミーム化しているからよく目にする文字列名だけかなと思っていましたが普通に使ってんだよな ウケる
#input
text=おはようございます😴😴😴😴
#output
おはようございます😃
D: 0.99999994
おはようございます😃
D: 0.9999998
おはようございます✨
D: 0.99999976
毎朝のおはツイと大量の顔文字にインスパイアされた文字列で検索してみましたが、サロメさんは長いツイートが多いから短い文章を入力にするとなかなか出てきてくれない感じがある。
#input
text=おバイオ
これなら・・・これならサロメさんしか出んやろ・・・!!!
#output
おちんぽ
D: 0.9309312
@24k341 うおおおおおおおおおおおおおおおおおおおおお
D: 0.8924248
6月のスケジュール
にじぺっくす→バイオ→空気読み
D: 0.88284606
コメントを残す