从多个句子中选择或生成规范变体

vzw*_*ick 23 php nlp text-mining information-extraction

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

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

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

我正在寻找一种程序化方式

  • 选择 "最干净"/最规范的版本
  • 或者生成一个代表"最低公分母"的新的.

请考虑以下单个EAN查询的示例结果:

  • 妮维雅Deo Roll-On Dry Impact for Men
  • NIVEA DEO滚动干/ blau
  • Nivea Deo Roll-On干式冲击男士,50毫升,3升装(3 x 50毫升)
  • Nivea Deo Roll on Dry/blau 50 ml
  • Nivea Deoroller 50ml干燥男士blau Mindestabnahme:6Stück(1 VE)
  • NIVEA Deoroller,对男性的干燥影响
  • NIVEA DEO干燥/ blau_50毫升

我的自制方法看起来像这样:

  • 基本清理:
    • 小写标题,
    • 剥去过多的空白
    • 抛出明显的停顿词,如"买"和"点击"
  • 为...构建一个数组 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神奇的方式来处理我不知道的问题?

Adi*_*rji 6

由于您现有的指标似乎偏向于较短的短语,因此您应该考虑将bigrams考虑在内.因此,不仅考虑单个单词的分数,还要考虑连续单词对的分数(例如'nivea deo',deo roll-on','roll-on dry'等).在计算每个标题的分数时,可以将每个unigram和bigram的分数计算在一起,你可以一起生成标题,但也许会给bigrams更多权重,这应该鼓励你的算法更喜欢更长的短语.

如果您拥有大量现有的大量名称,请考虑使用像TF-IDF这样的
东西您正在做的事情可以比作使用TF.使用您的全局语料库,您可以计算每个unigram和bigram的idf,这基本上是整个语料库中单词或短语的唯一或罕见的度量.
tf =你在这些结果中看到ngram的次数
idf =衡量ngram在所有结果中的独特性的全局度量(或者至少是非常大量的结果)
所以在计算标题的得分时,而不是只需将每个ngram的tf加在其中,就可以将每个ngram的tf*idf相加.Rarer ngrams(可能更好地区分此项目与其他所有项目)具有更高的idf,因此您的算法应该给予它们更高的权重.许多垃圾条款(如Mindestabnahme)会有非常高的idf,但它们会有一个非常小的tf,所以它们可能没有太大的区别.或者,删除你看到少于k次的令牌,以消除噪音.

要了解的另一个NLP技巧是Levenshtein距离 ..这是一种量化两个字符串相似程度的方法.您可以计算结果中每对字符串之间的levenshtein距离,然后尝试选择与所有其他字符串具有最低平均距离的结果.这本身可能效果不好......但是将这个分数与现有方法相结合可能会帮助您导航一些棘手的案例.