【问题标题】:Spell-Check: Find one-to-one token difference mapping between two strings拼写检查:查找两个字符串之间的一对一标记差异映射
【发布时间】:2017-08-15 01:28:53
【问题描述】:

我最近在一个互联网档案中偶然发现了这个问题,我很难理解它。我想在两个字符串之间的不同标记之间找到所需的映射。输出应该是一个字符串到字符串的映射。

例如:

String1:hewlottpackardenterprise 帮助纽约的美国零售商

String2:惠普企业帮助纽约的美国铁路

输出:
hewlottpackardenterprise -> 惠普企业

休洛特 -> 休利特

铁路 -> 铁路

纽约 -> 纽约

注意:我已经能够编写一个编辑距离方法,它可以找到所有类型的编辑(按类型分隔,如删除、替换等)并且可以将第一个字符串转换为第二个通过convert 方法

到目前为止我尝试了什么?

方法 1:我从一种简单的方法开始,即按空格分割两个字符串,将第一个字符串的标记插入哈希映射,并将另一个字符串的标记与该哈希映射进行比较。但是,这种方法很快就会失败,因为会丢失相关映射。

方法 2:我使用我的 covert 方法来查找字符串中的编辑位置和编辑类型。使用空间编辑,我可以从 hewlottpackardenterprise -> hewlett packardenterprise 创建一个映射。然而,随着越来越多的东西需要在同一个词中进行拆分,这种方法就爆炸了。

感谢您在这方面的任何想法!将消除 cmets 中的任何疑虑。

public String returnWhiteSpaceEdittoken(EditDone e, List<String> testTokens) {
    int pos = e.pos, count=0, i=0;
    String resultToken = null;

    if (e.type.equals(DeleteEdit)) {
        for (i=0;i<testTokens.size();i++) {
            count+=testTokens.get(i).length();
            if (count==pos) {
                break;
            }
            if (i!=testTokens.size()-1) {
                count++;
            }
        }

        resultToken = testTokens.get(i) + " " + testTokens.get(i+1);
    } else if (e.type.equals(InsertEdit)) {
        for (i=0;i<testTokens.size();i++) {
            count+=testTokens.get(i).length();
            if (count>pos) {
                break;
            }
            if (i!=testTokens.size()-1) {
                count++; 
            }
        }
        String token = testTokens.get(i);
        resultToken = token.substring(count-token.length(), pos) + token.substring(pos, count);
    }
    return resultToken;
}

【问题讨论】:

  • 也许你可以从句子对齐算法(统计机器翻译的一个子任务)中获得一些灵感。或者看看序列比对方法,因为它们用于查找 DNA 序列之间的重叠。

标签: java string algorithm nlp spell-checking


【解决方案1】:

处理此类问题的一种非常常见的方法是在两个字符串之间找到最长的公共子序列(或者它是最短的编辑脚本的双重),然后对输出进行后处理以获得您想要的特定格式;在你的情况下,字符串映射。

维基百科在这里对这个问题做了相当不错的介绍:https://en.wikipedia.org/wiki/Longest_common_subsequence_problem

Myers 的一篇很棒的论文“An O(ND) Difference Algorithm and Its Variations”可以在这里找到。 http://www.xmailserver.org/diff2.pdf

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多