使用关键字从文本文件中查找最匹配的行.有点奏效,但并不完美,我该如何修复
本文关键字:何修复 完美 文本 文件 关键字 查找 | 更新日期: 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,并保存行的索引,而不是行本身(如果它对您来说更重要)。的列表