Given是一组单词,例如{柏林,柏林,柏林,BeRlin,柏林,柏林,柏林}。在某些情况下,我必须照原样对待这些单词(不能更改为统一大小写)。我必须选一个。是否有使用NLP的解决方案可以帮助我实现这一目标,例如,选择一个与大多数人最接近的人。
谢谢
答案 0 :(得分:1)
您可以使用Sorensen–Dice系数进行此操作。
coefficientRatio =((2 * |X∩Y|)/(| X | + | Y |))
其中,
| X | &| Y |是两组的基数,
|X∩Y|是两组中共同元素的数量
系数范围为0-1,其中1高度相似,0最小相似。
因为您需要将集合区分大小写:
用任何符号替换字符集。 (注意:使用ascii值可能会
急剧改变准确率)。我建议将
字符编码为不同的符号,以保持准确性。
例如:
b ='!',e ='@',r ='#',l ='$',i ='%',n ='^',
B ='&',E ='*',R ='(',L =')',I ='?' ,N ='{'
代码:-
var oldSet = ['Berlin' , 'BERLIN' , 'BERlin', 'BeRlin','berlin','berliN' , 'berLIN'];
var newSet = ['&@#$%^', '&*()?{', "&*($%^", "&@($%^", "!@#$%^", "!@#$%{", "!@#)?{"];
var ratio= [];
for(var i=0; i<newSet.length-1; i++) {
for(var j=i+1; j<newSet.length; j++) {
var cof= getCoefficient(newSet[i], newSet[j], getIntersection(newSet[i], newSet[j]));
print("\n\n" + oldSet[i] + "====" + oldSet[j] + "===>" + cof);
ratio.push(cof);
}
print("\n");
}
//This function will return coeffiecient between 0 to 1
function getCoefficient(x, y, commonCnt) {
return ((2*commonCnt) / (x + y));
}
输出:-
Berlin====BERLIN===>0.16666666666666666
Berlin====BERlin===>0.6666666666666666
Berlin====BeRlin===>0.8333333333333334
Berlin====berlin===>0.8333333333333334
Berlin====berliN===>0.6666666666666666
Berlin====berLIN===>0.3333333333333333
BERLIN====BERlin===>0.5
BERLIN====BeRlin===>0.3333333333333333
BERLIN====berlin===>0
BERLIN====berliN===>0.16666666666666666
BERLIN====berLIN===>0.5
BERlin====BeRlin===>0.8333333333333334
BERlin====berlin===>0.5
BERlin====berliN===>0.3333333333333333
BERlin====berLIN===>0
BeRlin====berlin===>0.6666666666666666
BeRlin====berliN===>0.5
BeRlin====berLIN===>0.16666666666666666
berlin====berliN===>0.8333333333333334
berlin====berLIN===>0.5
berliN====berLIN===>0.6666666666666666