如何在 Java 中将字符串"Weeelcommme tttto Unnnnnicommmerce"转换为"Welcome to Unicommerce"?



Input

Input string = "Weeelcommme tttto Unnnnnicommmerce";

期望的输出

Welcome to Unicommerce

这与从字符串中删除重复项不同,因为我们还需要">e"和">m"。使用HashSet删除重复项只会给我们独特的元素。

有很多方法可以自动完成,所有这些都需要某种字典。一个简单的算法是三元组频率分析。我将在下面描述一个例子。

字典

考虑字典

1. hello
2. he
3. my
4. name

输入

现在考虑输入heello mmy nnamme

构建三元组

我们需要构建字典中每个元素的三元组。

1. hello = hel ell llo
2. he = he
3. my = my
4. name = nam ame

然后我们拆分每个单词并构建其三元组

1. heello = hee eel ell llo
2. mmy = mmy
3. nnamme = nna nam amm mme

我们构建了一个向量并计算两者之间的cos相似性。

旁注

在比较之前,所有三元组都散列成唯一的整数,进一步的三元组应被视为整数。

比较

考虑函数z(v1, v2) = c其中 z 计算 v1 和 v2 的余弦相似性。然后v1 = (hee, eel, ell, llo)v2 = (hel, ell,llo, 0).现在余弦相似性将告诉这些向量有多"相似"。对字典中的所有元素执行此操作并选择余弦相似性最接近 1 的单词将是最佳匹配的单词。我不会做算术,因为它很长,但在这里你可以找到相似性的公式。

其他注意事项

这种三元组频率方法在语言处理中非常常用,以确定给定文本的语言,并应用于早期的语音到文本应用程序。我希望你从上面看到三元组如何帮助你找到答案。我认为您遇到的唯一问题是找到字典,因为"Unicommerce"不是英语词典中的单词。

您可以将折叠单词的字典哈希维护到它们的完整对应项,并使用简单的算法从候选单词中删除重复的字母。

a:[a]
aple:[apple]
ardvark:[aardvark]
to:[to/too]
unicomerce:[Unicommerce]
welcome:[welcome]

执行转换时,首先将句子拆分为单词,然后通过删除重复字母来创建查找引用,然后为每个消除重复的单词检索扩展的单词。

因此,"Weeelcommme tttto Unnnnnicommmerce"首先变成["welcome","to","unicomerce"],每个成员都从你的字典中扩展为"Welcome to Unicommerce"或"Welcome too Unicommerce"。 你会有一个不完美的解决方案,可以使用语法检查器来帮助消除单词的歧义,并且最终可能会得到字典中找不到的单词,但这至少是一个可行的起点。