字分离算法(Word-separating algorithm)

2019-06-27 22:54发布

什么是算法 - 似乎在域名停放页面上使用 - 这需要一个spaceless一堆话(如“thecarrotofcuriosity”)和更多或更少正确地将其分解成构成词(如“好奇胡萝卜”)?

Answer 1:

首先得有个基本的特里代表你的字典数据结构。 当你在字符串中的字符遍历,搜索通过自己的方式特里结构一组指针,而不是一个单一的指针 - 设定与特里树的根部接种。 每个字母,整个集是在一次通过由字母表示的指针前进,并且如果一组元件不能由字母被推进,它是从集合中移除。 每当你到达一个可以结束的话,添加新根的-线索到集(跟踪见过的词,与该组元素相关联的列表)。 最后,当所有的字都经过处理,返回字的任意列表是在根的-线索。 如果有一个以上,这意味着该字符串可以以多种方式(如“therapistforum”,它可以被解析为[“治疗师”,“论坛”]或[“的”,“强奸犯”,“论坛”被打破了]),它是不确定的,我们会回来。

或者,在wacked了伪代码(Java的foreach,元组括号表示,集表示与支架, 利弊用头::尾,[]空列表):

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;
 }

让我知道如果我需要澄清或我错过了什么?



Answer 2:

我会想象他们采取的字典单词列表像/usr/share/dict/words您共同或花园的各种Unix系统,并试图找到字匹配的套(从左边开始?)导致原始文本的最大金额通过一个匹配被覆盖。 一个简单的广度优先搜索的实现可能会工作得很好,因为它显然不具有运行速度快。



Answer 3:

我拍摄这些网站做类似这样的:

  1. 获取单词的列表,您的目标语言
  2. 删除,如“一”,“无用”的话说,“”,...
  3. 在列表中运行,并检查它的话是该域名的子串
  4. 在剩下的列表中最常见的词(或那些具有最高的AdSense等级,...)

当然,这导致废话expertsexchange,但什么人会想到你那里...



Answer 4:

(免责声明:我没有尝试它自己,所以把它仅仅作为实验食品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,那么就应该在原始字符串该位置插入一个空格。 如果是小于零,那么你不应该。

请在此处掉落注意:如果尝试它(或这种东西)和它的作品(或不工作)为您:-)



文章来源: Word-separating algorithm