我正在使用将我的GTIN/EAN查询映射到产品数据的API。
由于返回的数据来自商家产品Feed,因此以下情况几乎是普遍情况:
我正在寻找一种编程方式来实现
考虑单个EAN查询的以下示例结果:
我的自制方法如下:
word => global occurence
构建一个数组"Nivea" => 7
"Deo" => 5
"Deoroller" => 2
…
"VE" => 1
"Nivea Deo" => 12
"Nivea Deoroller VE" => 10
"Nivea Deo" => 6
"Nivea Deoroller VE" => 3.34
显然,我的方法很基本,容易出错,并且偏向于使用频繁使用的单词的简短句子-产生或多或少令人满意的结果。
最佳答案
由于您现有的指标似乎偏向较短的词组,因此您应该考虑将二元组合纳入考虑范围。因此,除了仅考虑单个单词的得分外,还应考虑连续单词对的得分(例如“nivea deo”,“deo roll-on”,“roll-on dry”等)。在计算每个标题的分数时,请考虑可以从标题中一起生成的每个unigram和bigram的分数,但是可以给bigrams更大的权重,这应该鼓励您的算法更喜欢较长的短语。
如果您拥有大量现有的大型名称库,可以考虑使用TF-IDF这样的名称
您做对的事情可以比作使用TF。使用全局语料库,您可以计算每个字母组合和双字母组的idf,这基本上是整个语料库中单词或短语的唯一性或稀有性的度量。
tf =您在这些结果中看到ngram的次数
idf =衡量所有结果中ngram可能有多独特的全局度量(或至少有很多)
因此,在计算标题的分数时,您不仅要对每个ngram的tf * idf进行累加,而不是简单地对其中每个ngram的tf求和。较稀疏的ngram(在区分此项目和所有其他项目方面可能做得更好)具有较高的idf,因此您的算法应赋予它们更高的权重。许多垃圾术语(例如Mindestabnahme)的idf确实很高,但它们的tf很小,因此它们可能不会有太大的变化。或者,修剪掉 token 的次数少于k次,以消除噪音。
要了解的另一个NLP技巧是Levenshtein distance ..这是一种量化两个字符串的相似程度的方法。您可以计算结果中每对字符串之间的levenshtein距离,然后尝试优先选择与所有其他字符串的平均距离最低的结果。这本身可能无法很好地工作……但是将这种分数与您现有的方法结合起来可能会帮助您应对一些棘手的情况。
关于php - 从多个句子中选择或生成规范变体,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10856896/