什么是算法 - 似乎在域名停放页面上使用 - 采用无空间的一堆词(例如“thecarrotofcuriosity”)并且或多或少正确地将其分解为组成词(例如“好奇的胡萝卜” “)?
答案 0 :(得分:2)
从表示字典的基本Trie数据结构开始。当您遍历字符串的字符时,使用一组指针而不是单个指针在trie中搜索 - 该集合用trie的根来播种。对于每个字母,整个集合通过字母指示的指针立即前进,如果字母无法前进设置元素,则将其从集合中移除。每当您到达可能的词尾时,请向该组添加一个新的trie根(跟踪与该set元素关联的单词列表)。最后,一旦处理完所有字符,返回一个任意的单词列表,这些单词位于trie的根部。如果不止一个,这意味着字符串可以以多种方式分解(例如“therapistforum”,可以解析为[“治疗师”,“论坛”]或[“the”,“强奸犯”,“论坛” ])它是未定义的,我们将返回。
或者,在一个wacked up伪代码中(Java foreach,元组用parens表示,set用粗体表示,cons使用head :: tail,[]是空列表):
List<String> breakUp(String str, Trie root) {
Set<(List<String>, Trie)> set = {([], root)};
for (char c : str) {
Set<(List<String>, Trie)> newSet = {};
for (List<String> ls, Trie t : set) {
Trie tNext = t.follow(c);
if (tNext != null) {
newSet.add((ls, tNext));
if (tNext.isWord()) {
newSet.add((t.follow(c).getWord() :: ls, root));
}
}
}
set = newSet;
}
for (List<String> ls, Trie t : set) {
if (t == root) return ls;
}
return null;
}
如果我需要澄清或错过了某些内容,请告诉我......
答案 1 :(得分:1)
我想他们会在你的普通或花园种类的Unix系统上使用像/usr/share/dict/words
这样的词典单词列表,并尝试找到一组单词匹配(从左边开始?),这会产生最大量的原始文本被比赛所覆盖。一个简单的广度优先搜索实现可能会正常工作,因为它显然不必快速运行。
答案 2 :(得分:0)
我对这些网站进行成像时的表现与此类似:
当然,这导致了对expertsexchange的废话,但你还有什么期望......
答案 3 :(得分:0)
(免责声明:我自己并没有尝试过,所以只把它作为实验的食物.4克主要是从蓝天中取出来的,根据我的经验,3克不能很好地工作; 5克以上可能会更好,即使你必须处理一个非常大的表)。它在某种意义上也是简单化的,它不会将字符串的结尾带入帐户 - 如果它对你有用,你可能需要考虑修复结尾。
此算法将在可预测的时间内运行,该时间与您尝试拆分的字符串的长度成比例。
所以,首先:采取大量人类可读的文本。对于每个文本,假设它在单个字符串 str 中,运行以下算法(伪代码表示法,假设[]是类似哈希表的索引,并且不存在的索引返回'0 “):
for(i=0;i<length(s)-5;i++) {
// take 4-character substring starting at position i
subs2 = substring(str, i, 4);
if(has_space(subs2)) {
subs = substring(str, i, 5);
delete_space(subs);
yes_space[subs][position(space, subs2)]++;
} else {
subs = subs2;
no_space[subs]++;
}
}
这将为您建立表格,这将有助于确定给定的4克是否需要插入空格。
然后,将您的字符串拆分,我将其表示为 xstr ,然后执行:
for(i=0;i<length(xstr)-5;i++) {
subs = substring(xstr, i, 4);
for(j=0;j<4;j++) {
do_insert_space_here[i+j] -= no_space[subs];
}
for(j=0;j<4;j++) {
do_insert_space_here[i+j] += yes_space[subs][j];
}
}
然后你可以走“ do_insert_space_here []”数组 - 如果给定位置的元素大于0,那么你应该在原始字符串中的那个位置插入一个空格。如果它小于零,那么你不应该。
如果您尝试(或类似的东西),请在此处留言,它对您有效(或不起作用): - )