我一直在寻找一种高效的分词算法,但没有取得太大的成功。例如,给出单词hello,我希望获得该单词的所有可能分区:{h,e,l,l,o},{h,e,l,lo},{h,e,llo} ,. ..,{你好}。我发现的所有关于分词的讨论都不是我的意思。最有效的分词算法?
预先感谢您!
我一直在寻找一种高效的分词算法,但没有取得太大的成功。例如,给出单词hello,我希望获得该单词的所有可能分区:{h,e,l,l,o},{h,e,l,lo},{h,e,llo} ,. ..,{你好}。我发现的所有关于分词的讨论都不是我的意思。最有效的分词算法?
预先感谢您!
您将展示一些示例,我们可以将注意力集中在逗号上。 要么有逗号,要么没有。
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}。
问题是NP完整,需要通过回溯来解决。
这个想法是在每个级别,你决定这个角色是属于当前分区还是应该去一个新的。以递归方式进行此操作,并且每次达到该单词的结尾时,都有一个分区。
我不这么认为。您可以定义所有解决方案的枚举,并如上所示进行翻译。 – 2011-03-19 09:32:50
你提到的会有相同的复杂性:)。但是的确如此,你的方法更好。 – 2011-03-19 09:36:57
这不是NP完整的。你可能的意思是它需要指数时间的输入大小,这是可以理解的,看看输出的大小如何在输入大小上同样呈指数形式。 – 2011-03-19 17:38:22
大多数喜欢你想构造一个后缀-tree。
很好! – Dunaril 2011-03-19 10:44:43
非常感谢!似乎事情比我们预期的要简单:)我得到它运行;) – jarandaf 2011-03-19 11:20:13