我使用三元搜索树制作了一个拼写检查代码。任何人都可以告诉我如何在TST中找到下一个可能的单词。 例如,如果我想搜索我是否在拼写检查器中搜索单词“Manly”并且该单词在TST中不存在,那么它的输出就像 你的意思是: “人” “芒果” 。 。可能接近单词
答案 0 :(得分:1)
我已经实施了自己的拼写检查,但是我使用的是三元组,而不是简单的三元组,正如Peter Kankowski建议here。您可以查看我的blog了解一些细节以及我是如何做到的。它是希腊语,但你可以得到一个主意。
编辑:
好的,你是对的。 基本思路是使用预先创建的候选列表来获得给定的编辑距离(对我来说,值为2)。要减小列表的大小,可以使用通配符。 当然,这样的列表可以以不同的方式构造。我喜欢像这样的/ while循环(例如,对于两个替换的候选者)
void Substitute2( vector<wchar_t*>& v, const wstring& w )
{
size_t len = w.size();
if ( len < 2 )
return;
size_t p1 = 0, p2 = 1;
while ( p1 < len ) {
p2 = p1 + 1;
while ( p2 < len ) {
wchar_t* chars = new wchar_t[ len + 1 ];
for ( size_t i = 0; i < len; ++i ) {
if ( i != p1 && i != p2 ) {
chars[ i ] = w[ i ];
}
}
chars[ p1 ] = '?';
chars[ p2 ] = '?';
chars[ len ] = '\0';
v.push_back( chars );
p2++;
}
p1++;
}
}
在准备好候选人名单后,对列表中的每个项目进行三元组dag的简单搜索将为我们提供拼写错误的单词的建议。
void Search( FileNode* pDict, FileNode* pNode, const wchar_t* Word, wstring Sug, set<wstring>& List )
{
if ( IsNullLink( pNode, pDict ) )
return;
if ( *Word == '?' ) {
Search( pDict, GetLo( pNode, pDict ), Word, Sug, List );
Search( pDict, GetEq( pNode, pDict ), Word + 1, Sug + pNode->Char, List );
Search( pDict, GetHi( pNode, pDict ), Word, Sug, List );
} else {
if ( *Word < pNode->Char ) {
Search( pDict, GetLo( pNode, pDict ), Word, Sug, List );
} else if ( *Word > pNode->Char ) {
Search( pDict, GetHi( pNode, pDict ), Word, Sug, List );
} else {
if ( pNode->Char == '\0' )
{
List.insert( Sug );
}
if ( *Word != '\0' ) {
Search( pDict, GetEq( pNode, pDict ), Word + 1, Sug + pNode->Char, List );
}
}
}
}
注意:字典是一个已编译(基于文件)的三元dag
答案 1 :(得分:0)
在TST中搜索单词将在树中的特定位置终止。从这一点开始,你可以简单地在树上升到一个级别,直到达到不仅仅是你来自的孩子的水平。
在该级别上,您只需选择其他可能的路径并返回这些词语。