void Main(string[] args)
{
// Load model from file.
var model = new Model();
model.LoadVectors("model.bin");
// Get 10 nearest words to user input
while (true)
{
Console.Write("Input 1 > ");
String word1 = Console.ReadLine();
Console.Write(word1);
String[] splitted = word1.Split(' ');
List<String> set1 = new List<string>();
List<String> set2 = new List<string>();
for (int i = 0; i < splitted.Length; i++)
{
foreach (var item in model.NearestWords(splitted[0], 150))
{
set1.Add(item.Key);
}
foreach (var item in model.NearestWords(splitted[1], 150))
{
set2.Add(item.Key);
}
}
List<String> combinations = set1.SelectMany(a => set2.Select(n => String.Concat(a, " ", n))).ToList();
List<String> str = new List<String>();
List<String> result = new List<String>();
str = Alternate_titles.Select(o => o.Alternate_title).ToList();
str = str.ConvertAll(d => d.ToLower());
for (Int32 i = 0; i < combinations.Count; ++i){
if(str.Contains(combinations[i])){
result.Add(combinations[i]);
}
}
var hash = new HashSet<string>(result);
hash.Dump();
Console.WriteLine();
}
}
我编写的代码使用word2vec库(只是找到与输入词具有语义相似性的词)来匹配具有相似含义的职位。
如果我输入职位名称Software developer
,则会在Software
中存储前150个类似的set1
字词,并在developer
中存储set2
的相似字词。
然后,List<String> combinations = set1.SelectMany(a => set2.Select(n => String.Concat(a, " ", n))).ToList();
此行在set1
和set2
中生成字符串的二元cartaesian产品。
然后,
for (Int32 i = 0; i < combinations.Count; ++i){
if(str.Contains(combinations[i])){
result.Add(combinations[i]);
}
}
此部分仅检查combination
(cartaesian产品的结果)是否是我正在使用的数据库中的实际职位(在这种情况下为str
)。
最后,它打印结果。
我的问题是,此代码仅限于二元cartaesian产品,但它适用于任何n-ary
字符串。例如,它应该为Software developer intern
执行相同的操作。
我必须修改哪部分代码才能使其灵活并使其适用于任何n-ary字符串?