我正在使用将我的GTIN/EAN查询映射到产品数据的API。

由于返回的数据来自商家产品Feed,因此以下情况几乎是普遍情况:

  • 每个GTIN多个结果
  • 产品的标题几乎是非结构化的
  • 产品的标题被“污染”了
  • 与SEO相关的东西
  • 有关所含数量的信息
  • “买二送一”优惠,
  • 等。

  • 我正在寻找一种编程方式来实现
  • 选择 可用的“最干净”/最规范的版本
  • 或生成一个代表“最低公分母”的新词。

  • 考虑单个EAN查询的以下示例结果:
  • 妮维雅(Nivea)Deo男式无痕干洗冲击仪
  • NIVEA DEO干卷/blau
  • 妮维雅(Nivea)Deo男用干式抗冲击喷雾剂,50毫升,3装(3 x 50毫升)
  • 妮维雅(Nivea)Deo Roll on Dry/blau 50 ml
  • 妮维雅(Nivea)除臭剂50毫升男士干爽blau Mindestabnahme:6Stück(1 VE)
  • NIVEA除臭剂,男士干爽
  • 妮维雅DEO干卷/蓝色50毫升

  • 我的自制方法如下:
  • 基本清理:
  • 小写标题
  • 去除多余的空格,
  • 抛出明显的停用词,例如“buy”和“click”。
  • 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

  • 显然,我的方法很基本,容易出错,并且偏向于使用频繁使用的单词的简短句子-产生或多或少令人满意的结果。
  • 您会选择其他方法吗?
  • 是否有一些NLP魔术方法可以解决我不知道的问题?
  • 最佳答案

    由于您现有的指标似乎偏向较短的词组,因此您应该考虑将二元组合纳入考虑范围。因此,除了仅考虑单个单词的得分外,还应考虑连续单词对的得分(例如“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/

    10-12 17:50