String 句子的词级编辑距离

String 句子的词级编辑距离,string,algorithm,edit-distance,String,Algorithm,Edit Distance,有没有一种算法可以让你找到两个句子之间的单词级编辑距离? 例如,“一只大肥狗”和“有肥狗的大房子”有1个替换,3个插入您可以使用与查找字符串中的编辑距离相同的算法来查找句子中的编辑距离。你可以把一个句子想象成一个从字母表中提取的字符串,其中每个字符都是英语中的一个单词(假设用空格来标记一个“字符”的开始和下一个结束)。任何计算编辑距离的标准算法,例如计算Levenshtein距离的标准,都可以用来解决这个问题。这里是@templatetypedef在ActionScript中的思想的一个示例实现

有没有一种算法可以让你找到两个句子之间的单词级编辑距离?
例如,“一只大肥狗”和“有肥狗的大房子”有1个替换,3个插入

您可以使用与查找字符串中的编辑距离相同的算法来查找句子中的编辑距离。你可以把一个句子想象成一个从字母表中提取的字符串,其中每个字符都是英语中的一个单词(假设用空格来标记一个“字符”的开始和下一个结束)。任何计算编辑距离的标准算法,例如计算Levenshtein距离的标准,都可以用来解决这个问题。

这里是@templatetypedef在ActionScript中的思想的一个示例实现(对我来说非常有用),它计算标准化的Levenshtein距离(换句话说,给出的值在[0..1]范围内)

私有函数nlevenshtein(s1:String,s2:String):编号{
var-tokens1:Array=s1.split(“”);
var tokens2:Array=s2.split(“”);
const len1:uint=tokens1.length,len2:uint=tokens2.length;
变量d:向量=新向量(len1+1);

对于(i=0;i一般来说,这称为。实际上,对齐的实体(位、字符、单词或DNA碱基)并不重要,只要算法适用于一种类型的项目,它就适用于其他所有类型的项目。重要的是要全局对齐还是局部对齐

全局对齐尝试对齐每个序列中的每个残基,在序列相似且大小大致相等时最有用。一种通用的全局对齐技术是基于的算法。当人们谈论Levinstain距离时,通常指的是全局对齐。该算法非常严格t向前看,有几个人独立地发现了它,有时你可能会遇到本质上是相同的东西,但在两个字符串之间的编辑距离的上下文中提到得更多


局部比对对于被怀疑在较大的序列上下文中包含相似区域或相似序列基序的不同序列更有用。局部比对是一种基于动态规划的通用局部比对方法。它在自然语言处理中很少使用,在生物信息处理中更常用信息学。

D中的实现在任何范围内都是通用的,因此数组。因此,通过将句子拆分为字符串数组,它们可以通过算法运行,并提供编辑编号


以下是使用动态规划方法实现句子编辑距离算法的Java实现

public class EditDistance {

    public int editDistanceDP(String sentence1, String sentence2) {
        String[] s1 = sentence1.split(" ");
        String[] s2 = sentence2.split(" ");
        int[][] solution = new int[s1.length + 1][s2.length + 1];

        for (int i = 0; i <= s2.length; i++) {
            solution[0][i] = i;
        }

        for (int i = 0; i <= s1.length; i++) {
            solution[i][0] = i;
        }

        int m = s1.length;
        int n = s2.length;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1[i - 1].equals(s2[j - 1]))
                    solution[i][j] = solution[i - 1][j - 1];
                else
                    solution[i][j] = 1
                            + Math.min(solution[i][j - 1], Math.min(solution[i - 1][j], solution[i - 1][j - 1]));
            }
        }
        return solution[s1.length][s2.length];
    }

    public static void main(String[] args) {
        String sentence1 = "first second third";
        String sentence2 = "second";
        EditDistance ed = new EditDistance();
        System.out.println("Edit Distance: " + ed.editDistanceDP(sentence1, sentence2));
    }
}
公共类编辑距离{
public int editDistanceDP(字符串语句1、字符串语句2){
字符串[]s1=1.split(“”);
字符串[]s2=sentence2.split(“”);
int[][]解决方案=新int[s1.length+1][s2.length+1];

对于(inti=0;i请从nltk包中查看python中的AlignedSent函数。它在单词级别对齐句子

public class EditDistance {

    public int editDistanceDP(String sentence1, String sentence2) {
        String[] s1 = sentence1.split(" ");
        String[] s2 = sentence2.split(" ");
        int[][] solution = new int[s1.length + 1][s2.length + 1];

        for (int i = 0; i <= s2.length; i++) {
            solution[0][i] = i;
        }

        for (int i = 0; i <= s1.length; i++) {
            solution[i][0] = i;
        }

        int m = s1.length;
        int n = s2.length;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (s1[i - 1].equals(s2[j - 1]))
                    solution[i][j] = solution[i - 1][j - 1];
                else
                    solution[i][j] = 1
                            + Math.min(solution[i][j - 1], Math.min(solution[i - 1][j], solution[i - 1][j - 1]));
            }
        }
        return solution[s1.length][s2.length];
    }

    public static void main(String[] args) {
        String sentence1 = "first second third";
        String sentence2 = "second";
        EditDistance ed = new EditDistance();
        System.out.println("Edit Distance: " + ed.editDistanceDP(sentence1, sentence2));
    }
}