C++ 有识别不完整单词的拼写库吗?
我的用例如下:给定一个字符串,识别从字符串开头开始的所有有效单词。例如:C++ 有识别不完整单词的拼写库吗?,c++,spell-checking,spelling,C++,Spell Checking,Spelling,我的用例如下:给定一个字符串,识别从字符串开头开始的所有有效单词。例如: blueberryqqq 应输出: blue blueberry 为此,我有一个字典结构,它使用。例如,如果我的字典只包含上述两个单词,它将如下所示: b->l->u->e->\0 ->b->e->r->r->y->\0 当我调查输入字符串时,拼写检查过程可以告诉我,当我逐字逐句地检查时,是否: 我正在寻找一个有效的词 我找到了一个有效的
blueberryqqq
应输出:
blue
blueberry
为此,我有一个字典结构,它使用。例如,如果我的字典只包含上述两个单词,它将如下所示:
b->l->u->e->\0
->b->e->r->r->y->\0
当我调查输入字符串时,拼写检查过程可以告诉我,当我逐字逐句地检查时,是否:
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
时,我知道“blue”是一个有效的单词,但我也知道继续往下看字符串,因为我的字典告诉我可能有更多的单词。一旦我到达y
,我就停下来。非常有效,因为对于所有有效的单词,我只访问每个字母一次,而且一旦字典告诉我没有必要再进一步,我就停止拼写检查。太好了
我的问题是我的字典trie是根据/usr/share/dict/words构建的,该文件不包含“蓝莓”的复数形式,也就是“蓝莓”,并且通常不包含所有单词的所有“派生词”。因此,如果输入字符串是blueberriesqq
,我只会得到有效的blue
如果我要使用拼写检查库,如aspell
或hunspell
,据我所知,我需要单独检查所有子字符串的拼写!e、 g.b
,bl
,blu
等。效率很低!不仅如此,我还不知道什么时候该停止检查。e、 g.我怎么知道没有以蓝莓QQ
开头的单词
所以,我的问题是:是否有一个拼写检查库可以容纳我的用例
请注意,拼写建议并不能解决这个问题。将
blub
传递给aspell不会返回任何以blub
开头的拼写建议。因此,我将结束我的搜索,即使仍然有可能找到更多有效的单词。您可以使用类似aspell-d en dump master | aspell-l en expand>my.dict
的方法将词典扩展到单词列表中,以构建trie。这通常最好使用排序的单词列表,而不是词典。通过利用排序,您可以在排序列表中找到以蓝色开头的点。。。每个新字母都有log(N)
lookup,并且没有任何内存膨胀试图用子字符串等扩展这些内容。你进入单词越深,它得到的速度越快,但速度永远不会太慢。有问题要求我们推荐或查找一本书、工具、软件库,教程或其他非现场资源与堆栈溢出无关。您确定已正确实现trie吗?在我看来,你可以用O(n)(n是字典的大小(计数字符),O(n)来查找字符串。但是用O(1)给出新字符时的更新时间:您只需跟踪活动节点。@screwnut:您可以将您的问题从查找字典工具转变为从/usr/share/dict/words
检索所有带派生词的单词