From 5abe7521ba6b79aacd8037f19d869350406f16b8 Mon Sep 17 00:00:00 2001 From: alikia2x Date: Sun, 22 Sep 2024 20:14:09 +0800 Subject: [PATCH] add: tokenizer and getEmbedding remove: model --- lib/nlp/getEmbedding.ts | 38 +++++++++++++++++++++++++++ lib/nlp/tokenizer.ts | 56 ++++++++++++++++++++++++++++++++++++++++ public/model | Bin 32327 -> 0 bytes 3 files changed, 94 insertions(+) create mode 100644 lib/nlp/getEmbedding.ts create mode 100644 lib/nlp/tokenizer.ts delete mode 100644 public/model diff --git a/lib/nlp/getEmbedding.ts b/lib/nlp/getEmbedding.ts new file mode 100644 index 0000000..e20b863 --- /dev/null +++ b/lib/nlp/getEmbedding.ts @@ -0,0 +1,38 @@ +type EmbeddingDict = { [key: number]: Float32Array }; + +function getEmbeddingLayer(buffer: Buffer): EmbeddingDict { + const dict: EmbeddingDict = {}; + + const entrySize = 514; + const numEntries = buffer.length / entrySize; + + for (let i = 0; i < numEntries; i++) { + const offset = i * entrySize; + const key = buffer.readUInt16LE(offset); + const floatArray = new Float32Array(128); + + for (let j = 0; j < 128; j++) { + floatArray[j] = buffer.readFloatLE(offset + 2 + j * 4); + } + + dict[key] = floatArray; + } + + return dict; +} + +function getEmbedding(tokenIds: number[], embeddingDict: EmbeddingDict, contextSize: number) { + let result: number[] = []; + for (let i = 0; i < contextSize; i++) { + if (i < tokenIds.length) { + const tokenId = tokenIds[i]; + result = result.concat(Array.from(embeddingDict[tokenId])) + } + else { + result = result.concat(new Array(128).fill(0)) + } + } + return new Float32Array(result); +} + +export {getEmbeddingLayer, getEmbedding}; \ No newline at end of file diff --git a/lib/nlp/tokenizer.ts b/lib/nlp/tokenizer.ts new file mode 100644 index 0000000..02dd516 --- /dev/null +++ b/lib/nlp/tokenizer.ts @@ -0,0 +1,56 @@ +type TokenDict = { [key: string]: number }; + +function tokenize(query: string, tokenDict: TokenDict): number[] { + const tokenIds: number[] = []; + let index = 0; + + // Replace spaces with "▁" + query = "▁" + query.replace(/ /g, "▁"); + query = query.replace(/\n/g, "<0x0A>"); + + while (index < query.length) { + let bestToken = null; + let bestLength = 0; + + // Step 2: Find the longest token that matches the beginning of the remaining query + for (const token in tokenDict) { + if (query.startsWith(token, index) && token.length > bestLength) { + bestToken = token; + bestLength = token.length; + } + } + + if (bestToken) { + tokenIds.push(tokenDict[bestToken]); + index += bestLength; + continue; + } + + // Step 3: Handle the case where no token matches + const char = query[index]; + if (char.charCodeAt(0) <= 127) { + // If the character is ASCII, and it doesn't match any token, treat it as an unknown token + console.error(`Unknown token: ${char}`); + index++; + continue; + } + + // If the character is non-ASCII, convert it to a series of bytes and match each byte + const bytes = new TextEncoder().encode(char); + for (const byte of bytes) { + const byteToken = `<0x${byte.toString(16).toUpperCase()}>`; + if (tokenDict[byteToken] === undefined) { + console.error(`Unknown byte token: ${byteToken}`); + index++; + continue; + } + tokenIds.push(tokenDict[byteToken]); + } + index++; + } + + return tokenIds; +} + +export default tokenize; +export type { TokenDict }; diff --git a/public/model b/public/model deleted file mode 100644 index 0c4ef7e07a54027ecd5c397f27f0449cb975656a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32327 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 yMrZKkSA8hzlgb1m7b8=l=nw&-tjj=m7wV#2`rk