我正在使用将我的 GTIN/EAN 查询映射到产品数据的 API。
由于返回的数据来自商家产品 Feed,因此几乎普遍存在以下情况:
- 每个 GTIN 的多个结果
- 产品的标题几乎没有结构
- 产品的标题被“污染”了
- SEO 相关内容,
- 有关所含数量的信息,
- “买二送一”优惠,
- 等等
我正在寻找一种程序化的方式来实现这两者
- 选择可用的“最干净”/最规范的版本
- 或生成一个代表“最小公分母”的新值。
考虑以下单个 EAN 查询的示例结果:
- Nivea Deo Roll-On Dry Impact for Men
- NIVEA DEO Roll on Dry/blau
- Nivea Deo Roll-On Dry Impact for Men,50 毫升,3 件装(3 x 50 毫升)
- Nivea Deo Roll on Dry/blau 50 毫升
- Nivea Deoroller 50ml dry for Men blau Mindestabnahme: 6 Stück (1 VE)
- NIVEA Deoroller,男士干燥效果
- NIVEA DEO Roll on Dry/blau_50 ml
我的自制方法如下所示:
- 基本清理:
- 小写标题,
- 去掉过多的空格,
- 去掉明显的停用词,例如“购买”和“点击”
- 为
word => global occurence
构建一个数组“妮维雅”=> 7
"Deo"=> 5
"Deoroller"=> 2
…
"VE"=> 1
- 计算每个标题的“累积词值”
"Nivea Deo"=> 12
“妮维雅止汗剂 VE”=> 10
- 将累积值除以标题的长度,得到一个分数
"Nivea Deo"=> 6
"Nivea Deoroller VE"=> 3.34
显然,我的方法非常基础,容易出错,并且偏向于包含常用词的短句——产生或多或少令人满意的结果。
- 您会选择不同的方法吗?
- 是否有一些 NLP 神奇的方法可以解决我不知道的问题?
最佳答案
由于您现有的指标似乎偏向于较短的短语,因此您应该考虑将双字母组合考虑在内。因此,不要只考虑单个单词的分数,还要考虑连续单词对的分数(例如“nivea deo”、deo roll-on、“roll-on dry”等)。在计算每个标题的分数时,将您可以从标题中生成的每个单字母组和双字母组的分数考虑在内,但可能会赋予双字母组更大的权重,这应该会鼓励您的算法更喜欢更长的短语。
如果您有大量的现有语料库,其中包含大量此类姓名供您使用,请考虑使用类似 TF-IDF 的语料库。
你正在做的事情可以比作只是使用 TF。使用您的全局语料库,您可以计算每个单字母组和双字母组的 idf,这基本上是衡量一个词或短语在整个语料库中的独特性或稀有性的指标。
tf = 您在这些结果中看到 ngram 的次数
idf = 一个 ngram 在所有结果(或至少非常多的结果)中的独特性的全局度量
因此,在计算标题的分数时,不是简单地将其中每个 ngram 的 tf 相加,而是将每个 ngram 的 tf*idf 相加。稀有的 ngram(可能在区分此项与所有其他项方面做得更好)具有更高的 idf,因此您的算法应该给予它们更高的权重。许多垃圾术语(如 Mindestabnahme)的 idf 非常高,但它们的 tf 非常小,因此它们可能不会产生很大的不同。或者剪掉你看到的次数少于 k 次的标记,以消除噪音。
另一个需要了解的 NLP 技巧是 Levenshtein distance .. 这是一种量化两个字符串相似程度的方法。您可以计算结果中每对字符串之间的编辑距离,然后尝试选择与所有其他字符串的平均距离最小的结果。这本身可能效果不佳……但是将这个分数与您现有的方法结合起来可能会帮助您解决一些棘手的问题。
关于php - 从多个句子中选择或生成规范变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10856896/