ユーザーの略歴
404 経歴が見つかりません
2016年7月12日からのメンバー
投稿:
返信:
上記(2)は、あくまでテキストベースで参照するための簡単なサンプルになります。
そのため、グローバルの値が gval=$LB("abc","xyz") や gval="abc"_$C(1)_"xyz" など制御コードが含まるときは、ファイルにはそのまま出力されませんので、その点ご注意くださいませ。
「そのようなデータも見たいな」と言われる方は、コメントなどでお寄せください。
@Minoru Horita さん、分かりやすいベクトル検索の紹介記事、ありがとうございます!具体的に、大量の日本語文章データをIRISに格納して、そこからIRISのSQL一発で 「意味が似ている」データをヒットさせるデモは、分かりやすくてワクワクしますね。
感想だけではなんなので、記事の一連のPythonコードを、以下のようなIRISクラスに置き換えてみました。
(1) プロパティは、日本語文書 contents とそのベクトルデータ contentsv の2つ
(2) sqlalchemy ではなく、IRIS上で INSERT文発行して、ベクトルデータを格納
全く同じロジックですが、Pythonコード含めて、少しでも他メンバーの方のご参考になればと掲載します。
Class User.nakav3 Extends %Persistent
{
Property contents As %String(MAXLEN = 4096);
Property contentsv As %Vector(DATATYPE = "DOUBLE", LEN = 768);
ClassMethod load() [ Language = python ]
{
import iris
import pandas as pd
from pyarrow.parquet import ParquetFile
import pyarrow as pa
pf = ParquetFile('/var/tmp/cc100/0000.parquet')
first_rows = next(pf.iter_batches(batch_size = 1000))
df = pa.Table.from_batches([first_rows]).to_pandas()
df = df.replace("\n","",regex=True)
for index,row in df.iterrows():
text = row['text']
iris.cls('User.nakav3').insertToIRIS(text)
print('Done')
}
ClassMethod search(question As %String)
{
if $g(question)="" set question="大都市での生活は便利な半面、混雑や環境の悪さなどの問題もある。"
set questionv=$tr(..Embedd(question)," '[]")
set sql="SELECT TOP 5 VECTOR_DOT_PRODUCT(contentsv, TO_VECTOR(?, DOUBLE, 768)) as sim, contents"
set sql=sql_" FROM SQLUser.nakav3 ORDER BY sim DESC"
set rs=##class(%SQL.Statement).%ExecDirect(.stmt,.sql,.questionv)
while rs.%Next() {
write rs.%Get("sim")," ",rs.%Get("contents"),!
}
}
ClassMethod insertToIRIS(text As %String)
{
set textv=$tr(..Embedd(text)," '[]")
&sql(insert into SQLUser.nakav3 (contents, contentsv) values (:text, TO_VECTOR(:textv, DOUBLE, 768) ) )
}
ClassMethod Embedd(text) As %String [ Language = python ]
{
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('stsb-xlm-r-multilingual')
embeddings = model.encode(text)
# convert the embeddings to a string
embeddings_list = [str(embedding.tolist()) for embedding in embeddings]
return str(embeddings_list)
}
}
データロード
do ##class(User.nakav3).load()
データ検索
do ##class(User.nakav3).search("大都市での生活は便利な半面、混雑や環境の悪さなどの問題もある。")
Open Exchange アプリケーション:
認定証と Credly バッジ:
Global Mastersバッジ:
Seisukeさんはグローバルマスターズバッジをまだ取得していません。
フォロワー:
フォロー中:
Seisukeさんはまだ誰もフォローしていません。
@松川 幸久 さん、
$LIST形式のデータであれば、$LISTTOSTRING(list) というコマンドで文字列にできます。
ということで、こんなのはどうでしょうか?
set line=time_" ["_type_"] "_gref if type="SET" { if $LISTVALID(gval) { // if gval is $LIST data set gval="$LB("_$LISTTOSTRING(gval)_")" } set line=line_"="_gval }
わかりやすく $LB( ) で前後をくくってみました。 以下のように出力されます。
11/07/2024 02:50:12 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka=$LB(a,1,xyz)
11/07/2024 10:51:29 [SET] ^["^^c:\intersystems\iris\mgr\user\"]naka(2)=123