Java - 排名/匹配句子

时间:2015-01-13 11:51:38

标签: java

我正在寻找一种排名/匹配两个句子的方法。

例如,请使用以下2个示例句子。

  1. 这是一个简短的句子。
  2. 这句长句很多。
  3. 我的新句子这是一句话。

    我想将我的新句子与现有句子进行比较。我的新句子几乎与句子1匹配,但只与我的句子2匹配。

    我可以使用算法或工作示例,以便对新句子进行排名。句子1应该具有较高的等级,而句子2将与新句子相比较低。我的编码语言是Java。

2 个答案:

答案 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 zinhttp://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>

此示例显示谓词具有相同的名词,但比短句更多一个词....

我希望这可以帮助你向前迈进一步。