3

我的用例如下:给定一个字符串,识别从字符串开头开始的所有有效单词。例如:

blueberryqqq

应该输出:

blue
blueberry

为此,我有一个使用trie<char>. 例如,如果我的字典只包含上面的两个单词,它会是这样的:

b->l->u->e->\0
          ->b->e->r->r->y->\0

当我调查我的输入字符串时,拼写检查过程可以告诉我,我逐个字母是否:

  1. 我正在寻找一个有效的词
  2. 我找到了一个有效的词
  3. 我不在通往有效词的道路上

请注意,这些都是标志,并且两者都1可以2同时为真。通过这种方法,我可以一次有效地找到两者blue,并blueberry在到达y. 继续这个例子,这就是我从一个字母到另一个字母时发生的事情:

b:1, l:1, u:1, e:1|2, b:1, e:1, r:1, r:1, y:2

当我看到 时1|2,我知道“蓝色”是有效词,但我也知道要继续往下走,因为我的字典告诉我可能有更多的词。一旦我到达y,我就停下来。非常有效,因为我对所有有效单词只访问每个字母一次,一旦字典告诉我没有必要再进一步,我就会停止拼写检查。完美的!

我的问题是我的字典树是从 /usr/share/dict/words 构建的,并且该文件不包含复数形式的“蓝莓”,即“蓝莓”,通常不会包含所有的“衍生物”的话。所以如果输入字符串是blueberriesqqq,我只会得到blue有效的。

如果我要使用aspellor之类的拼写检查库hunspell据我所知,我需要单独对所有子字符串进行拼写检查!例如b, bl,blu等。效率很低!不仅如此,我不知道什么时候停止检查。例如,我怎么知道没有任何以 开头的单词blueberriesqq

所以,我的问题变成了:是否有一个拼写检查库可以适应我的用例?

请注意,拼写建议不会削减它。传递blueb给 aspell 不会返回任何以 . 开头的拼写建议blueb。因此,即使仍有更多有效单词的可能性,我也会结束我的搜索。

4

0 回答 0