Trie与单词

时间:2016-05-26 17:46:36

标签: algorithm nlp trie

我有一个用例,我想纠正单词。 我有一套正确和错误的单词[拼写错误]。 我用所有的话来填充特里。 我有每个单词的正确和错误版本。

如果我得到的话是" a"为了纠正,

- 我在trie中搜索它。如果有这个词,我想将这个词与这个词的正确版本联系起来。

解决方案:     我可以在trie中错误单词的最后一个节点上设置正确的单词[" a1"]。并且可以将其解析为" a1"

但我必须在最后一个节点存储每个单词的正确版本,这将增加内存占用量。 因为我已将所有单词加载到trie中[正确/不正确]。 有没有什么方法可以在正确和不正确的单词之间建立关联,而无需再将最后一个节点中的整个单词存储为值? 任何指针?

public class TrieNode<T> {

    private Map<Character, TrieNode<T>> childs;
    private boolean complete;
    private T value;

    ....
    }

1 个答案:

答案 0 :(得分:1)

你可以使用一个字典。在C#中,那将是:

Dictionary<string, string> MisspellingsLookup = new Dictionary<string, int>();

关键是拼写错误,值是正确的拼写。

现在,有些词通常以多种方式拼写错误。例如,“场合”通常拼错为“ocassion”或“occassion”如果要减少多个拼写错误所使用的内存,可以在构造期间使用临时字典。每当你添加拼写错误时,你都会在好词汇词典中查找正确的拼写,如果它已经存在,那么你就可以使用该值。因此,您所做的只是存储对现有单词的引用,而不是创建新的字符串。这是一个例子:

Dictionary<string, string> GoodWords = new Dictionary<string, int>();
Dictionary<string, string> Misspellings = new Dictionary<string, string>();

void AddMisspelling(string misspelled, string correct)
{
    string goodWord;
    if (!GoodWords.TryGetValue(correct, out goodWord))
    {
        goodWord = correct;
        GoodWords.Add(correct, correct);
    }

    // Always use goodWord here, so you're not creating duplicate strings.
    Misspellings.Add(misspelled, goodWord);
}

完成单词添加后,您可以清除GoodWords字典以节省空间:

GoodWords = null;

我在这里推荐一本字典,因为它几乎肯定会使用更少的内存,而查找是O(1)而不是O(字长)。