noahsettersten commited on
Commit
b3d858d
1 Parent(s): d4a9888

feat: Create `code_vectors` table

Browse files
lib/medical_transcription/code_vector.ex ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ defmodule MedicalTranscription.CodeVector do
2
+ use Ecto.Schema
3
+ alias Ecto.Changeset
4
+ alias MedicalTranscription.Repo
5
+
6
+ import Ecto.Query
7
+ import Pgvector.Ecto.Query
8
+
9
+ schema "code_vectors" do
10
+ field :code, :string
11
+ field :description, :string
12
+ field :description_vector, Pgvector.Ecto.Vector
13
+ end
14
+
15
+ def changeset(code_vector, params \\ %{}) do
16
+ code_vector
17
+ |> Changeset.cast(params, [:code, :description, :description_vector])
18
+ |> Changeset.validate_required([:code, :description, :description_vector])
19
+ end
20
+
21
+ def insert_vector(params) do
22
+ changeset = changeset(%__MODULE__{}, params)
23
+
24
+ case Repo.insert(changeset) do
25
+ {:ok, _} ->
26
+ {:ok, "Success!"}
27
+
28
+ {:error, changeset} ->
29
+ messages =
30
+ Ecto.Changeset.traverse_errors(changeset, fn {msg, opts} ->
31
+ Enum.reduce(opts, msg, fn {key, value}, acc ->
32
+ String.replace(acc, "%{#{key}}", to_string(value))
33
+ end)
34
+ end)
35
+
36
+ {:error, messages}
37
+ end
38
+ end
39
+
40
+ def exists_for_code?(code) do
41
+ Repo.exists?(
42
+ from v in __MODULE__,
43
+ where: v.code == ^code
44
+ )
45
+ end
46
+
47
+ def find_similar(search_vector, limit \\ 5) do
48
+ Repo.all(
49
+ from v in __MODULE__,
50
+ order_by: cosine_distance(v.description_vector, ^search_vector),
51
+ limit: ^limit
52
+ )
53
+ end
54
+ end
priv/repo/migrations/20240125151833_create_code_vectors.exs ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ defmodule MedicalTranscription.Repo.Migrations.CreateLabelVectors do
2
+ use Ecto.Migration
3
+
4
+ def change do
5
+ create table("code_vectors") do
6
+ add :code, :string
7
+ add :description, :string
8
+ add :description_vector, :vector, size: 384
9
+ end
10
+ end
11
+ end