【发布时间】: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