字符串的匹配集合

本文关键字:集合 字符串 | 更新日期: 2023-09-27 18:16:01

我有一个包含1000个产品的List<Product>和一个包含100个品类名称的List<string>

  • Product类具有NameDescriptionKeywords类的性质。
  • 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