我正在寻找一种排名/匹配两个句子的方法。
例如,请使用以下2个示例句子。
我的新句子这是一句话。
我想将我的新句子与现有句子进行比较。我的新句子几乎与句子1匹配,但只与我的句子2匹配。
我可以使用算法或工作示例,以便对新句子进行排名。句子1应该具有较高的等级,而句子2将与新句子相比较低。我的编码语言是Java。
答案 0 :(得分:1)
public class Main {
public static int getLevenshteinDistance(String s, String t) {
if (s == null || t == null) {
throw new IllegalArgumentException("Strings must not be null");
}
int n = s.length(); // length of s
int m = t.length(); // length of t
if (n == 0) {
return m;
} else if (m == 0) {
return n;
}
if (n > m) {
// swap the input strings to consume less memory
String tmp = s;
s = t;
t = tmp;
n = m;
m = t.length();
}
int p[] = new int[n + 1]; // 'previous' cost array, horizontally
int d[] = new int[n + 1]; // cost array, horizontally
int _d[]; // placeholder to assist in swapping p and d
// indexes into strings s and t
int i; // iterates through s
int j; // iterates through t
char t_j; // jth character of t
int cost; // cost
for (i = 0; i <= n; i++) {
p[i] = i;
}
for (j = 1; j <= m; j++) {
t_j = t.charAt(j - 1);
d[0] = j;
for (i = 1; i <= n; i++) {
cost = s.charAt(i - 1) == t_j ? 0 : 1;
// minimum of cell to the left+1, to the top+1, diagonally left
// and up +cost
d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost);
}
// copy current distance counts to 'previous row' distance counts
_d = p;
p = d;
d = _d;
}
// our last action in the above loop was to switch d and p, so p now
// actually has the most recent cost counts
return p[n];
}
}
答案 1 :(得分:0)
格罗宁根大学(NL)的一个研究小组提出了一个句子解构的API。
注意:虽然用户界面是国际的,但是已经认可 句子和结果中使用的术语都是荷兰语。
这是界面(虽然以荷兰为导向)继续搜索类似的英语倡议。
http://www.let.rug.nl/vannoord/bin/alpino(没有参数的网络界面)
尝试 http://www.let.rug.nl/vannoord/bin/alpino?words=dit is een korte zin 和 http://www.let.rug.nl/vannoord/bin/alpino?words=dit is een zin
结果可以作为XML获取。
<alpino_ds version="1.3">
<node begin="0" cat="top" end="5" id="0" rel="top">
<node begin="0" cat="smain" end="5" id="1" rel="--">
<node begin="0" end="1" frame="determiner(het,nwh,nmod,pro,nparg)" getal="ev" id="2" infl="het" lcat="np" lemma="dit" naamval="stan" pdtype="pron" persoon="3o" pos="det" postag="VNW(aanw,pron,stan,vol,3o,ev)" pt="vnw" rel="su" rnum="sg" root="dit" sense="dit" status="vol" vwtype="aanw" wh="nwh" word="Dit"/>
<node begin="1" end="2" frame="verb(unacc,sg_heeft,copula)" id="3" infl="sg_heeft" lcat="smain" lemma="zijn" pos="verb" postag="WW(pv,tgw,ev)" pt="ww" pvagr="ev" pvtijd="tgw" rel="hd" root="ben" sc="copula" sense="ben" stype="declarative" tense="present" word="is" wvorm="pv"/>
<node begin="2" cat="np" end="5" id="4" rel="predc">
<node begin="2" end="3" frame="determiner(een)" id="5" infl="een" lcat="detp" lemma="een" lwtype="onbep" naamval="stan" npagr="agr" pos="det" postag="LID(onbep,stan,agr)" pt="lid" rel="det" root="een" sense="een" word="een"/><node aform="base" begin="3" buiging="met-e" end="4" frame="adjective(e)" graad="basis" id="6" infl="e" lcat="ap" lemma="heel" naamval="stan" pos="adj" positie="prenom" postag="ADJ(prenom,basis,met-e,stan)" pt="adj" rel="mod" root="heel" sense="heel" vform="adj" word="hele"/>
<node begin="4" end="5" frame="noun(de,count,sg)" gen="de" genus="zijd" getal="ev" graad="basis" id="7" lcat="np" lemma="zin" naamval="stan" ntype="soort" num="sg" pos="noun" postag="N(soort,ev,basis,zijd,stan)" pt="n" rel="hd" rnum="sg" root="zin" sense="zin" word="zin"/>
</node>
</node>
</node>
<sentence>Dit is een hele zin</sentence>
</alpino_d>
此示例显示谓词具有相同的名词,但比短句更多一个词....
我希望这可以帮助你向前迈进一步。