我被分配了一个问题需要解决:
问题如下所述:
公司维护了一个包含所有产品规格的数据集(目前大约有4500个产品)。现在,每个客户都会分享他们想从公司购买的产品的详细信息(名称、数量、品牌等)。然而,客户在输入数据集时可能拼错产品名称。此外,公司数据集中一个产品可以有多种不同的称呼。例如:红辣椒可以被称为贡特尔辣椒、全红辣椒、带梗红辣椒、无梗红辣椒等。
我完全不知道该如何处理这个问题。我应该使用基于机器学习的技术吗?如果是,请解释我应该做什么。如果可以不使用机器学习解决这个问题,也请解释你的方法。我使用的是Python。
挑战:客户可以用多种方式指代一个产品,公司也以多种不同规格(如名称、数量、计量单位等变化)存储单个产品。通过标记的数据集,我可以发现客户输入的红牛能量饮料(customer data)实际上是红牛(label),而客户输入的红牛也是红牛。但找到这个标签有什么用呢?因为在我的公司数据集中,红牛也以多种方式存在。我还得找出公司数据集中红牛的所有不同名称。
我的方法:我将准备一个这样的Python字典:
{"red chilly" : ['red chilly', 'guntur chilly', 'red chilly with stem'],"red bull" : ['red bull energy drink', 'red bull']}
字典中的每个条目都是一个产品,其键是产品的某种标准名称,值是该产品的所有可能名称。现在客户输入一个产品名称,比如红牛能量饮料。我将在字典中检查每个键。如果该键的任何值匹配,那么我会明白该产品实际上是红牛,并且在公司数据集中可以用红牛和红牛能量饮料两种方式指代。这个方法怎么样?
回答:
最佳情况
如果你能访问到产品的所有可能使用名称,这将是最佳情况,你所需要做的就是检查用户输入的名称是否在同义词中。5000个产品,每个产品有10个同义词,具有良好设计的模式,应该可以由一个强大的数据库系统轻松处理。
基于搜索引擎的解决方案
假设你没有访问同义词的权限,但你有产品的详细英文描述,那么你可以搜索用户输入的名称在描述中。可以使用像Apache Solr这样的搜索引擎,它使用基于TFIDF的倒排索引。Solr返回的顶级结果文档将是相应的产品。简而言之,将你的文档描述索引到Solr中,并在Solr中搜索用户输入的产品名称。请注意,这是基于词汇的而不是基于语义的,但只要你的用户不会称香蕉为“黄色圆柱形水果”,词汇基础的搜索就足以满足你的需求。
基于ML的解决方案
有很好的分布式向量表示(如word2vec、glove),称为嵌入。嵌入的重要属性是相关词之间的距离会很小。然而,这些向量对你来说并不好,因为你有的是短语而不是单词(红是一个词,但红辣椒是一个短语)。开源中没有好的预训练的短语到向量嵌入可用。如果你想使用基于向量相似性的模型,你将不得不构建自己的短语到向量模型。因此,假设你能够构建一个短语到向量模型,你需要找到与客户输入的产品名称向量接近的向量(对应于产品)。