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

时间:2012-06-01 20:25:03

标签: php text-mining information-extraction nlp

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

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

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

我正在寻找一种编程方式

  • 选择 “最干净”/最规范的版本
  • 生成一个代表“最低公分母”的新文件。

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

  • Nivea Deo Roll-On Dry Impact for Men
  • NIVEA DEO Roll on Dry / 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 Roll on Dry / blau_50 ml

我的自制程序看起来像这样:

  • 基本清理:
    • 小写标题,
    • 剥去过多的空白,
    • 抛出明显的停用词,例如“买”和“点击”
  • 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神奇的方法可以解决我不知道的问题?

4 个答案:

答案 0 :(得分: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 distance ..这是一种量化两个字符串相似程度的方法。您可以计算结果中每对字符串之间的levenshtein距离,然后尝试选择与所有其他字符串具有最低平均距离的结果。这本身可能效果不好......但是将这个分数与现有方法相结合可能会帮助您导航一些棘手的案例。

答案 1 :(得分:4)

我最好:

  1. 将所有字符串转换为较低(或较高)的大小写
  2. 对所有字符串进行多序列比对
  3. 转换回原始案例
  4. 查找每列中最常见的字母
  5. 删除间隙
  6. 对于你的例子:

    1. 将所有字符串转换为较低(或较高)的大小写

      nivea deo roll-on dry impact for men
      nivea deo roll on dry/blau
      nivea deo roll-on dry impact for men, 50 ml, 3er pack (3 x 50 ml)
      nivea deo roll on dry/blau 50 ml
      nivea deoroller 50ml dry for men blau mindestabnahme: 6 stück (1 ve)
      nivea deoroller, dry impact for men
      nivea deo roll on dry/blau_50 ml
      
    2. 对所有字符串进行多序列比对

      nivea deo roll°°-on °°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      nivea deo roll°° on °°dry/blau°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      nivea deo roll°°-on °°dry °°°°°°°°°°impact for men, 50 ml, 3er pack (3 x 50 ml)°°°°°°°
      nivea deo roll°° on °°dry/blau °°°°°°°°°°°°°°°°°°°°°50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      nivea deo°roller 50ml dry °°°°°°°°°°°°°°°°°for men blau mindestabnahme: 6 stück (1 ve)
      nivea deo°roller, °°°°dry °°°°°°°°°°impact for men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      nivea deo roll°° on °°dry/blau_50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      

      (其中°表示间隙字符)

    3. 转换回原始案例

      Nivea Deo Roll°°-On °°Dry °°°°°°°°°°Impact for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      NIVEA DEO Roll°° on °°Dry/blau°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      Nivea Deo Roll°°-On °°Dry °°°°°°°°°°Impact for Men, 50 ml, 3er Pack (3 x 50 ml)°°°°°°°
      Nivea Deo Roll°° on °°Dry/blau °°°°°°°°°°°°°°°°°°°°°50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      Nivea Deo°roller 50ml dry °°°°°°°°°°°°°°°°°for Men blau Mindestabnahme: 6 Stück (1 VE)
      NIVEA Deo°roller, °°°°Dry °°°°°°°°°°Impact for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      NIVEA DEO Roll°° on °°Dry/blau_50 ml°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      
    4. 查找每列中最常见的字母

      Nivea Deo Roll°° on °°Dry °°°°°°°°°°°°°°°°°for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
      
    5. 删除空白

      Nivea Deo Roll on Dry for Men
      
    6. 除了步骤2(多序列比对)之外的所有内容都很简单。多序列比对通常用于生物信息学,参见例如。 hereherehere ...您当然可以找到C或Java代码,但我不确定PHP。

      <强>更新

      为了让您开始进行多重对齐,所谓的“星形对齐”基本上是一个序列(“星形中心”)与其他序列的成对比对的组合。通常使用动态编程来计算成对比对,参见例如。 herehere。要生成多个对齐,请选择一个字符串作为星形中心。您可以找到它与每个其他字符串之间的成对对齐,然后通过在它们中引入间隙来对齐成对对齐,以便所有对齐中的星形中心完美对齐。您可以使用上一步的结果作为下一步的星形中心重复该过程,直到它收敛为止,即结果不会改变。

      更新2: 您还可以使用整个单词作为符号(常数,原子)进行对齐。说,A = niveaB = deo等。这有以下优点:

      1. 不能通过对齐来改变单词,并且无论其长度如何都被平等对待
      2. 在进行成对比对时,您可以根据TF-IDF及其同义词分配替换单个词(“符号”)的成本。成对比对试图最小化(加权)序列之间的Levenshtein距离。
      3. 在你的例子中(自己尝试),这将导致

        Nivea Deo Roll on Dry for Men 50 ml
        

        即。我们也到了这里50 ml。这是因为跳过两个字母的单词并不比跳过20个字母的单词便宜。

答案 2 :(得分:2)

如果我理解正确你没有将这些名称与现有数据库相匹配,但试图尽可能接近产品的实际名称,那么这就是我的想法:

  1. 不要进行常规清理 - 只需删除额外的空格 - 保留停用词,字符大小写,分隔符(如连字符)。
  2. 将字符串拆分为空格中的术语。
  3. 拆分分隔符,数字/字符,字符大小写,但不删除原文,只需在拆分术语后添加其他术语,小写所有术语,删除重复和空术语
  4. 删除固定%字符串不常见的字词(如果测试后你知道它应该是40%或95%) - 这将删除商家添加的大部分内容。
  5. 找出每个词的最常见位置。
  6. 如果您获得多个具有相同最常见位置的术语,请检查哪一个更常见于另一个之前。将“宽松”的位置增加1,重复直到没有冲突
  7. 对于左边的每个术语,选择最常用的大写字母
  8. 合并剩余条款
  9. 使用你的例子它会像这样工作:

    第1步:

      

    Nivea Deo男士干式冲击

         

    NIVEA DEO Roll on Dry / 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 ml

    第2步:

      

    Nivea,Deo,Roll-On,Dry,Impact,for,Men

         

    NIVEA,DEO,Roll,on,Dry / blau

         

    Nivea,Deo,Roll-On,Dry,Impact,for,Men,50,ml,3er,Pack,(3,x,50,ml)

         

    Nivea,Deo,Roll,on,Dry / blau,50,ml

         

    Nivea,Deoroller,50ml,干燥,男士,blau,Mindestabnahme:,6,Stück,(1,VE)

         

    NIVEA,Deoroller,Dry,Impact,for,Men

         

    NIVEA,DEO,Roll,on,Dry / blau_50,ml

    第3步:

      

    nivea,deo,roll-on,roll,on,dry,impact,for,men

         

    nivea,deo,roll,on,dry / blau,dry,blau

         

    nivea,deo,roll-on,roll,on,dry,impact,for,men,50,ml,3er,pack,3,x,50,ml

         

    nivea,deo,roll,on,dry,blau,50,ml

         

    nivea,deoroller,50ml,50 ml,干燥,男士,blau,mindestabnahme,6,stück,1,ve

         

    nivea,deoroller,dry,impact,for,men

         

    nivea,deo,roll,on,dry / blau,dry,blau,50,ml

    第4步:(假设阈值为60%)

      

    nivea,deo,roll,on,dry,for,men

         

    nivea,deo,roll,on,dry,blau

         

    nivea,deo,roll,on,dry,for,men,50,ml

         

    nivea,deo,roll,on,dry,50,ml

         

    妮维雅,50毫升,干燥,适合男士,布劳

         

    妮维雅,干,男人

         

    nivea,deo,roll,on,dry,blau,50,ml

    第5步:

      

    nivea =&gt; 1

         

    deo =&gt; 2

         

    roll =&gt; 3

         

    on =&gt; 4

         

    dry =&gt; 5

         

    for =&gt; 6

         

    men =&gt; 7

         

    blau =&gt; 6

         

    50 =&gt; 8,6,2,7

         

    ml =&gt; 8,7,3,8

    第6步:

      

    nivea =&gt; 1

         

    deo =&gt; 2

         

    roll =&gt; 3

         

    on =&gt; 4

         

    dry =&gt; 5

         

    blau =&gt; 6

         

    for =&gt; 7

         

    men =&gt; 8

         

    50 =&gt; 9

         

    ml =&gt; 10

    第7步

      

    Nivea,Deo,Roll,on,Dry,blau for,Men,50,ml

    第8步

    最终结果: Nivea Deo Roll for Dry blau for men 50 ml

    此方法存在以下问题:

    1. 它不能很好地处理具有重复术语的名称(或者根本没有 - 在第一个术语丢失后的所有术语出现时)
    2. 它偏向于将连字符分隔或大小写分隔(ProductName)的名称部分拆分为空格分隔的部分 - 如果您在步骤8中检查最常见的版本,则可以修复此问题。

答案 3 :(得分:2)

你有一个非常好的NLP问题。大约一年前我做过类似的工作。我也会推荐adi92的方法。但如果您需要使用任何NLP软件,我建议使用Stanford NLP。该软件和相应的出版物也在此处。 http://nlp.stanford.edu/希望这会有所帮助。