add semantic search
This commit is contained in:
36
src/lib/components/SearchResults.svelte
Normal file
36
src/lib/components/SearchResults.svelte
Normal 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
5
src/lib/store.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
import { writable } from 'svelte/store';
|
||||
import type { SearchResult } from './utils/search';
|
||||
|
||||
const initArray: SearchResult[] = [];
|
||||
export const searchResults = writable(initArray);
|
1
src/lib/utils/poetry/embeddings.json
Normal file
1
src/lib/utils/poetry/embeddings.json
Normal file
File diff suppressed because one or more lines are too long
24
src/lib/utils/search.ts
Normal file
24
src/lib/utils/search.ts
Normal 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;
|
||||
}
|
Reference in New Issue
Block a user