add semantic search

This commit is contained in:
2024-05-31 01:31:37 -04:00
parent 53635f0d59
commit de9cccabda
19 changed files with 1398 additions and 105 deletions

View File

@@ -0,0 +1,36 @@
<script lang="ts">
import { searchResults } from '$lib/store';
import type { SearchResult } from '$lib/utils/search';
let results: SearchResult[] = [];
searchResults.subscribe((value: SearchResult[]) => {
results = value ? value : [];
});
function slugToTitle(slug: string) {
return slug
.replace(/-/g, ' ')
.split(' ')
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(' ');
}
</script>
{#if results.length > 0}
<div class="container mx-auto flex flex-col items-center">
<div class="prose">
<h1 class="py-6">Search results:</h1>
</div>
<ul>
{#each results as result}
<li class="py-4">
<h3 class="pb-1">
<a class="link" href="/poetry/{result.poem.id}">{slugToTitle(result.poem.id)}</a>
<p class="text-sm">(Relevance: {(result.similarity * 100).toFixed(3)})%</p>
</h3>
</li>
{/each}
</ul>
</div>
{/if}

5
src/lib/store.ts Normal file
View File

@@ -0,0 +1,5 @@
import { writable } from 'svelte/store';
import type { SearchResult } from './utils/search';
const initArray: SearchResult[] = [];
export const searchResults = writable(initArray);

File diff suppressed because one or more lines are too long

24
src/lib/utils/search.ts Normal file
View File

@@ -0,0 +1,24 @@
// src/lib/initModel.ts
import use, { UniversalSentenceEncoder } from '@tensorflow-models/universal-sentence-encoder';
// eslint-disable-next-line @typescript-eslint/no-unused-vars
import * as tf from '@tensorflow/tfjs-node';
export type Embedding = {
id: string;
vector: number[];
};
export type SearchResult = {
poem: Embedding;
similarity: number;
};
let model: UniversalSentenceEncoder | null = null;
export async function getModel(): Promise<UniversalSentenceEncoder> {
if (!model) {
model = await use.load();
console.log('Model loaded successfully!');
}
return model;
}