最近インターネットのアーカイブでこの質問に遭遇しました。私は2つの文字列の間の異なるトークンの間に望ましいマッピングを見つけたいと思っています。出力には、StringからStringへのマップが必要です。例えばスペルチェック:2つの文字列の間に1対1のトークンの違いのマッピングを見つける
:
文字列1:ヒューレット・パッカード企業
出力NYでアメリカの鉄道を助けた:hewlottpackardenterpriseは
文字列2がNYでアメリカのralewaysを助けた
を
hewlottpackardenterprise - >ヒューレット・パッカード企業hewlott - > hewlett
raleways - >鉄道
NY - > NY
注:私は削除などの種類によって分離編集のすべての種類を(、見つかった編集距離法を、書くことができました置換など)、最初の文字列をconvert
メソッドで変換することができます
これまで何を試みましたか?
アプローチ1:私はハッシュマップに最初の文字列のトークンを挿入し、このハッシュマップと他の文字列のトークンを比較し、スペースで文字列の両方を分割する単純なアプローチで始まりました。しかし、このアプローチは、関連するマッピングのミスとしてすぐには失敗します。
アプローチ2:私はcovert
メソッドを使用して、文字列の編集位置と編集のタイプを検索します。スペースの編集を使用して、hewlottpackardenterprise - > hewlett packardenterpriseからマッピングを作成できます。しかし、この方法は、同じ単語の中でより多くのものを分割する必要があるほど、爆発的なものになります。
この点についてご意見をお寄せください。コメントの疑いが解消されます。
は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配列間の重複を見つけるために使用されるので、配列アラインメントアプローチを見てください。 – lenz