使用关键字从文本文件中查找最匹配的行.有点奏效,但并不完美,我该如何修复

本文关键字:何修复 完美 文本 文件 关键字 查找 | 更新日期: 2023-09-27 17:59:30

在过去的两个小时里,我一直在努力让它发挥作用,取得了很大的成功,但它并没有100%发挥作用。它会自动将文件中的行建议到我认为最接近的1-2个单词,这不是我想要的。我希望它能尽可能地提出最好的建议。

示例如下:https://gyazo.com/6cb86e78b95026aeeb3f8cc96ca03163

正如你所看到的,它在控制台中给了我两个建议,但由于它在文本文档中的位置,它打印出了正确的建议。为什么它并不是给我唯一想要的,尽管它是逐字逐句的,因此比没有stattrak的关键词有更多的共同点。

这是我的代码:

string[] suggestContents = File.ReadAllLines("csgo_items.txt");
int lineCount = 0;
int mostSimilar = 0;
int currentSimilar = 0;
string[] splitLine = message.Split("_".ToCharArray());
Dictionary<int, int> suggestItem = new Dictionary<int, int>();
foreach (string line in suggestContents)
{
    for(int i = 0; i < splitLine.Length; i++)
    {
        if(line.ToLower().Contains(splitLine[i].ToLower()))
        {
            currentSimilar++;
        }
    }
    if(currentSimilar > mostSimilar)
    {
        List<int> suggestList = new List<int>();
        foreach (KeyValuePair<int, int> entry in suggestItem)
        {
            if(entry.Value == mostSimilar)
            {
                suggestList.Add(entry.Key);
            }
        }
        foreach(int intRemove in suggestList)
        {
            suggestItem.Remove(intRemove);
        }
        mostSimilar = currentSimilar;
        suggestItem.Add(lineCount, mostSimilar);
    }
    else if(currentSimilar == mostSimilar)
    {
        suggestItem.Add(lineCount, mostSimilar);
    }
    lineCount++;
    currentSimilar = 0;
}

谢谢,任何帮助都将不胜感激。

使用关键字从文本文件中查找最匹配的行.有点奏效,但并不完美,我该如何修复

让我用更惯用的翻译重新表述您的代码(看起来正确

var res =suggestContents.Select(
    (x,i) => new Tuple<int, string,int>
    (i, x , message.Split('_')
       .Count(z => x.ToLower().Contains(z.ToLower())))
    ).GroupBy(t => t.Item3).OrderByDescending(t => t.Key).First();

您可能想将其更改为

var res = suggestContents.Select(
             (x, i) => new Tuple<int, string, int>
             (i, x, message.Split('_')
                .Count(z => 
                (x.ToLower().Contains(z.ToLower()))
                ||
                 (x.ToLower().Split(' ').Any(w =>
                   z.ToLower().Contains(w.ToLower())))
                ))
             ).GroupBy(t => t.Item3).OrderByDescending(t => t.Key).First();

这个想法不仅是测试线路是否包含一个单词,还测试单词(stattraktm)是否包含线路任何部分的一部分(stattrakt)。

如果不看到TXT文件,很难提供帮助。你的控制台显示stattrakt似乎很奇怪,但在右边你可以看到stattrak™这是一个完全不同的词,在包含或任何东西中都不会匹配。

在不太修改代码的情况下,尽管我支持机器学习解决方案,但我更喜欢保持与原始代码接近的答案-

string[] suggestContents = File.ReadAllLines("csgo_items.txt");
int lineCount = 0;
int mostSimilar = 0;
int currentSimilar = 0;
string[] splitLine = message.Split("_".ToCharArray());
//Dictionary<int, int> suggestItem = new Dictionary<int, int>();
List<string> suggestedItems = new List<string>();
foreach (string line in suggestContents)
{
    for(int i = 0; i < splitLine.Length; i++)
    {
        if(line.ToLower().Contains(splitLine[i].ToLower()))
        {
            currentSimilar++;
        }
    }
    if(currentSimilar > mostSimilar)
    {
        //We clear the current list, it is no longer needed, we have better match
        //List<int> suggestList = new List<int>();
        suggestedItems.Clear();
        mostSimilar = currentSimilar;
        //add current line to array.
        suggestedItems.Add(line);
    }
    else if(currentSimilar == mostSimilar)
    {
        //if another match simply add to list without clearing it.
        suggestedItems.Add(line);
    }
    lineCount++;
    currentSimilar = 0;
}

可能有错误,因为我是在这里的编辑那里做的。

另一种选择可能是用正则for循环替换foreach,并保存行的索引,而不是行本身(如果它对您来说更重要)。的列表