字符串的匹配集合
本文关键字:集合 字符串 | 更新日期: 2023-09-27 18:16:01
我有一个包含1000个产品的List<Product>
和一个包含100个品类名称的List<string>
。
-
Product
类具有Name
、Description
和Keywords
类的性质。 -
Category
列表中有一个采样值是Bags, Luggage & Travel Accessories
。
我正在尝试与Product
的属性值匹配类别。
- 我已经试过Levenshtein distance.
- 我还尝试将类别分成单词并检查
.Contains(keyword)
。
最好的方法是什么?
if (_subcategory.Name == "Others")
{
var _items = _category.Items.Select(s => new
{
Item = s,
Match = GetStringMatchingPercent(s.Name.ToLower().Split(_separators, StringSplitOptions.RemoveEmptyEntries).Where(w => w.Length >= 3).ToList(), new List<string>()
{
deal.description.ToLower(),
deal.title.ToLower(),
deal.keywords.ToLower()
})
}).OrderByDescending(s => s.Match).ToList();
}
,
private static double GetStringMatchingPercent(List<string> keywords, List<string> strings)
{
int t = 0;
int d = 0;
try
{
foreach (string s in strings)
{
foreach (string k in keywords)
{
t++;
if (s.Contains(k))
{
d++;
}
}
}
return d / t * 100;
}
catch (Exception ex)
{
Utilities.HandleException(ex);
return 0;
}
}
如果我答对了问题;您可以使用以下代码:
List<string> categories = new List<string> {"Bags", "Luggage", "Travel", "Other"};
Product p = new Product();
p.Name = "MyProduct";
p.Keywords = "Luggage";
p.Description = "Some product";
Product p1 = new Product();
p1.Name = "MyProduct";
p1.Keywords = "Airport";
p1.Description = "Luggage";
Product p2 = new Product();
p2.Name = "MyProduct";
p2.Keywords = "Abc";
p2.Description = "Other";
List<Product> products = new List<Product> {p, p1, p2};
// Create a dictionary with a list of products for each category.
Dictionary<string, List<Product>> categorisedProducts = new Dictionary<string, List<Product>>();
foreach(string category in categories)
{
categorisedProducts.Add(category, new List<Product>());
}
// Categorise the products.
categories.ForEach(category => products.ForEach(product =>
{
string productString = product.Description + product.Keywords + product.Name;
if (productString.Contains(category))
{
categorisedProducts[category].Add(product);
}
}));
// Display all products with their category.
foreach (string s in categorisedProducts.Keys)
{
foreach (Product prod in categorisedProducts[s])
{
Console.WriteLine("Name: " + prod.Name);
Console.WriteLine("Description: " + prod.Description);
Console.WriteLine("Keywords: " + prod.Keywords);
Console.WriteLine("Category: " + s);
}
}
Console.Read();
输出:名称:MyProduct
说明:某产品
关键词:箱包
品类:行李
名称:MyProduct
描述:行李
关键词:机场
类别:箱包
名称:MyProduct
说明:其他
关键词:Abc
类别:其他
它的本质是创建一个使用提供的类别作为键的dictionary;因此,使用categorisedProducts["category"]
将获得属于该类别的产品列表。
当然,你必须先填满它。注释描述了发生的地方。对于categorylist中的每个字符串,它在每个可用产品中搜索三个提供的字符串。您可以根据自己的喜好添加产品的其他属性。
在底部,它循环遍历所有产品,并以正确的类别显示它们的属性。
注意:如果一个产品中出现多个类别,它将被添加到两个类别中。如果没有找到类别,则跳过该产品。I have added "Other" as a category to make this work
.
在互联网上查找Jaro模式距离匹配。这应该会给你指明正确的方向。我已经在不同的公司实现了这一点,当做得正确时,提供了你正在寻找的东西,并且非常快。
http://en.wikipedia.org/wiki/Jaro%E2%80%93Winkler_distance欢呼,Rob