如何修改LINQPad代码以支持n元笛卡尔积实现多词职位匹配
解决方案:支持任意n元职位标题的笛卡尔积匹配
你的核心需求是把原来仅支持二元输入的逻辑扩展到任意n元,主要需要修改两个关键部分:动态收集每个输入词的相似词集合,以及实现通用的多集合笛卡尔积生成逻辑。下面是具体的修改方案和完整代码:
关键修改点
- 移除硬编码的
splitted[0]、splitted[1]处理逻辑,改为循环遍历所有输入分词 - 实现一个通用的笛卡尔积扩展方法,支持任意数量的集合组合
- 调整相似词集合的存储结构,从单独的
set1/set2改为集合列表,适配多词场景
修改后的完整代码
using System; using System.Collections.Generic; using System.Linq; void Main(string[] args) { // Load model from file. var model = new Model(); model.LoadVectors("model.bin"); // Get nearest words combinations matching database titles while (true) { Console.Write("Input > "); string input = Console.ReadLine(); if (string.IsNullOrWhiteSpace(input)) break; // 增加退出逻辑,提升交互体验 string[] splitted = input.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); if (splitted.Length == 0) continue; // 动态收集每个输入词的前150个相似词集合 var similarWordSets = new List<List<string>>(); foreach (var word in splitted) { var similarWords = model.NearestWords(word, 150) .Select(item => item.Key) .ToList(); similarWordSets.Add(similarWords); } // 生成所有集合的笛卡尔积,转成空格分隔的字符串 var combinations = similarWordSets.CartesianProduct() .Select(words => string.Join(" ", words)) .ToList(); // 匹配数据库中的职位标题(简化原有逻辑) var dbTitles = Alternate_titles.Select(o => o.Alternate_title.ToLower()) .ToList(); var result = combinations.Intersect(dbTitles) .Distinct() .ToList(); result.Dump(); Console.WriteLine(); } } // 扩展方法:实现任意数量集合的笛卡尔积计算 public static class EnumerableExtensions { public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) { IEnumerable<IEnumerable<T>> result = new[] { Enumerable.Empty<T>() }; foreach (var sequence in sequences) { result = from seq in result from item in sequence select seq.Concat(new[] { item }); } return result; } }
代码说明
- 动态相似词收集:循环处理输入的每个分词,把每个词的相似词集合存入
similarWordSets列表,不管输入是1个、2个还是N个词都能适配。 - 通用笛卡尔积方法:通过扩展方法
CartesianProduct实现了任意数量集合的笛卡尔积计算,这是实现n元支持的核心。它通过迭代每个输入集合,逐步构建所有可能的组合。 - 简化匹配逻辑:用
Intersect替代了原来的循环判断,代码更简洁高效,同时天然保留了去重效果。 - 交互优化:增加了输入为空时的退出逻辑,避免无限空循环。
这样修改后,不管你输入“Software developer”还是“Software developer intern”甚至更长的职位短语,代码都能正确生成所有可能的相似词组合并匹配数据库中的标题。
内容的提问来源于stack exchange,提问作者Dawn17
相关产品推荐
相关产品推荐

