2011-03-19 65 views
2

我一直在寻找一种高效的分词算法,但没有取得太大的成功。例如,给出单词hello,我希望获得该单词的所有可能分区:{h,e,l,l,o},{h,e,l,lo},{h,e,llo} ,. ..,{你好}。我发现的所有关于分词的讨论都不是我的意思。最有效的分词算法?

预先感谢您!

回答

6

您将展示一些示例,我们可以将注意力集中在逗号上。 要么有逗号,要么没有。

Word  Commas 
{h,e,l,l,o} 1111 
{h,e,l,l o} 1110 
{h,e,l l o} 1100 
... 
{h e l l o} 0000 

所以看起来很明显,在4个位置上,可能有逗号或不逗号,彼此独立。你需要4位编码的分区,这是2^4点的可能性,我想这是16

这样你就可以形成一个循环:

for (int i = 0; i < 15; ++i) 
    bitsplit ("hello", i); 

,并通过你的话重复而遍历位的二进制表示。例如对于11,您有位:8 + 2 + 1 = 1011设置。这意味着{h,el,l,o}。

+0

很好! – Dunaril 2011-03-19 10:44:43

+0

非常感谢!似乎事情比我们预期的要简单:)我得到它运行;) – jarandaf 2011-03-19 11:20:13

1

问题是NP完整,需要通过回溯来解决。

这个想法是在每个级别,你决定这个角色是属于当前分区还是应该去一个新的。以递归方式进行此操作,并且每次达到该单词的结尾时,都有一个分区。

+1

我不这么认为。您可以定义所有解决方案的枚举,并如上所示进行翻译。 – 2011-03-19 09:32:50

+1

你提到的会有相同的复杂性:)。但是的确如此,你的方法更好。 – 2011-03-19 09:36:57

+2

这不是NP完整的。你可能的意思是它需要指数时间的输入大小,这是可以理解的,看看输出的大小如何在输入大小上同样呈指数形式。 – 2011-03-19 17:38:22

0

大多数喜欢你想构造一个后缀-tree。