求基于all-MiniLM-L6-v2 embedding的C#相似字符串搜索代码实现
C# 实现相似字符串搜索(基于all-MiniLM-L6-v2)
依赖准备
- 安装NuGet包:
SentenceTransformers(用于生成与Python兼容的embedding) - 安装NuGet包:
System.Text.Json(用于解析JSON格式的embedding文件)
假设的JSON文件结构
假设你的embeddings JSON文件格式如下(每个条目包含目标文本和对应的384维embedding向量):
[ { "text": "Ayrton Senna", "embedding": [0.123, -0.456, 0.789, ...] }, { "text": "Michael Schumacher", "embedding": [0.987, -0.654, 0.321, ...] } ]
完整实现代码
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.Json; using SentenceTransformers; namespace SimilarStringSearch { // 与JSON结构匹配的实体类 public class EmbeddingEntry { public string Text { get; set; } public float[] Embedding { get; set; } } class Program { static async System.Threading.Tasks.Task Main(string[] args) { // 配置参数 string inputText = "sena"; // 待搜索的输入字符串 string jsonFilePath = "embeddings.json"; // 本地embedding文件路径 string modelName = "all-MiniLM-L6-v2"; // 与Python端一致的模型 // 加载JSON中的embedding数据 var embeddingEntries = LoadEmbeddingEntries(jsonFilePath); // 加载预训练模型并生成输入文本的embedding var model = await SentenceTransformerModel.LoadAsync(modelName); var inputEmbedding = await model.EncodeAsync(inputText); // 找到最相似的条目 var mostSimilarEntry = FindMostSimilarEntry(inputEmbedding, embeddingEntries); // 输出结果 Console.WriteLine($"最相似条目:{mostSimilarEntry.Text}"); } // 读取并解析JSON文件 private static List<EmbeddingEntry> LoadEmbeddingEntries(string filePath) { string jsonContent = File.ReadAllText(filePath); return JsonSerializer.Deserialize<List<EmbeddingEntry>>(jsonContent); } // 计算余弦相似度并筛选最相似条目 private static EmbeddingEntry FindMostSimilarEntry(float[] inputEmbedding, List<EmbeddingEntry> entries) { return entries.OrderByDescending(entry => CalculateCosineSimilarity(inputEmbedding, entry.Embedding)).First(); } // 余弦相似度计算逻辑 private static float CalculateCosineSimilarity(float[] vecA, float[] vecB) { float dotProduct = 0; float magA = 0; float magB = 0; for (int i = 0; i < vecA.Length; i++) { dotProduct += vecA[i] * vecB[i]; magA += vecA[i] * vecA[i]; magB += vecB[i] * vecB[i]; } magA = (float)Math.Sqrt(magA); magB = (float)Math.Sqrt(magB); return magA == 0 || magB == 0 ? 0 : dotProduct / (magA * magB); } } }
注意事项
- 首次运行时会自动下载
all-MiniLM-L6-v2模型,需保证网络正常 - 确保JSON文件中的embedding向量维度为384(该模型固定输出维度)
- 若处理大规模数据,可考虑引入向量数据库优化相似度计算效率
内容的提问来源于stack exchange,提问作者Jean J. Michel
相关产品推荐
相关产品推荐

