拼写检查:三元搜索树

时间:2015-03-19 13:02:15

标签: algorithm data-structures spell-checking ternary-search-tree

我使用三元搜索树制作了一个拼写检查代码。任何人都可以告诉我如何在TST中找到下一个可能的单词。 例如,如果我想搜索我是否在拼写检查器中搜索单词“Manly”并且该单词在TST中不存在,那么它的输出就像 你的意思是: “人” “芒果” 。 。可能接近单词

2 个答案:

答案 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中搜索单词将在树中的特定位置终止。从这一点开始,你可以简单地在树上升到一个级别,直到达到不仅仅是你来自的孩子的水平。

在该级别上,您只需选择其他可能的路径并返回这些词语。