我正在使用将我的GTIN / EAN查询映射到产品数据的API。
由于返回的数据来自商家产品供稿,因此几乎普遍存在以下情况:
我正在寻找一种编程方式
考虑单个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
显然,我的方法非常基本,容易出错并且偏向于使用经常使用的单词的短句 - 产生或多或少的满意结果。
答案 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)
我最好:
对于你的例子:
将所有字符串转换为较低(或较高)的大小写
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
对所有字符串进行多序列比对
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°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
(其中°
表示间隙字符)
转换回原始案例
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°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
查找每列中最常见的字母
Nivea Deo Roll°° on °°Dry °°°°°°°°°°°°°°°°°for Men°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°
删除空白
Nivea Deo Roll on Dry for Men
除了步骤2(多序列比对)之外的所有内容都很简单。多序列比对通常用于生物信息学,参见例如。 here或here或here ...您当然可以找到C或Java代码,但我不确定PHP。
<强>更新强>
为了让您开始进行多重对齐,所谓的“星形对齐”基本上是一个序列(“星形中心”)与其他序列的成对比对的组合。通常使用动态编程来计算成对比对,参见例如。 here或here。要生成多个对齐,请选择一个字符串作为星形中心。您可以找到它与每个其他字符串之间的成对对齐,然后通过在它们中引入间隙来对齐成对对齐,以便所有对齐中的星形中心完美对齐。您可以使用上一步的结果作为下一步的星形中心重复该过程,直到它收敛为止,即结果不会改变。
更新2:
您还可以使用整个单词作为符号(常数,原子)进行对齐。说,A = nivea
,B = deo
等。这有以下优点:
在你的例子中(自己尝试),这将导致
Nivea Deo Roll on Dry for Men 50 ml
即。我们也到了这里50 ml
。这是因为跳过两个字母的单词并不比跳过20个字母的单词便宜。
答案 2 :(得分:2)
如果我理解正确你没有将这些名称与现有数据库相匹配,但试图尽可能接近产品的实际名称,那么这就是我的想法:
使用你的例子它会像这样工作:
第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
此方法存在以下问题:
答案 3 :(得分:2)
你有一个非常好的NLP问题。大约一年前我做过类似的工作。我也会推荐adi92的方法。但如果您需要使用任何NLP软件,我建议使用Stanford NLP。该软件和相应的出版物也在此处。 http://nlp.stanford.edu/希望这会有所帮助。