English 中文(简体)
简明核对算法
原标题:Simple spell checking algorithm

我的任务是为一项任务设立一个简单明了的核查人,但后来没有提供指导,因此,我怀疑任何人是否能够帮助我。 我不是在有人为我做转让之后,但任何方向或帮助算法,都会令人费!! 如果我所说的话不在现场的单线之内,那么Im的 s和我就坐在其他地方。

项目负荷正确地勾划了下几字,然后需要根据两项标准提出建议:

  • One letter difference (either added or subtracted to get the word the same as a word in the dictionary). For example stack would be a suggestion for staick and cool would be a suggestion for coo .

  • 替换一封信。 例如,坏处会是一种建议。

因此,只是为了确保我得到适当的解释。 我可能用[hello、好事、热情好、好客、好客]的话装上字句子,然后对(确切地说)字眼的建议是[好的、 go的]。

Speed是我在此进行的主要审议,但我认为我知道如何开展这项工作,我对这项工作的成效真心不清。 这样做的思路是创建<条码>地图和带;图形、病媒和带;架设;以及“,然后就每一条正确表述的字体而言,添加正确表述的工作,作为地图的关键,使矢量成为该词所有可能的错变。

然后,当我看一句话时,我就从地图的每一个矢量看,看这句话是否是正确表述的词之一。 如果是的话,我就把钥匙作为拼凑的建议。

虽然如此,它似乎愿意接受欧洲复兴开发银行的记忆,但每一字肯定会有数千个相互交错? 如果我最初对正确措辞的字句是大的话,这似乎也非常缓慢?

我认为,也许我只能研究类似于一米研究的钥匙,从而缩短时间。 但后来又一次,如果它们以某种方式重复,这很可能意味着钥匙是一项建议,意思是,我不需要所有的人。

那么,我只想看一下我应该看什么方向。 我确实赞赏任何帮助,因为我确实不知道如何估计不同方式做事的速度(我们没有在班级上接受过这种教育)。

最佳回答

解决这一问题的更简单的方法确实是预先绘制的地图[黑字]——和;[建议]。

问题在于,如果删除一封信,就会增加或替代候选人many

因此,我建议另一种解决办法。

http://en.wikipedia.org/wiki/Levenshtein_distance. Levenshtein Distance

解决办法按增量步骤加以描述,通常每个设想的搜索速度都应不断提高,我试图首先以更简单的想法(从执行期)加以组织。 只要你对结果感到欣慰,就可自由终止。


0.Preliminary

  • Implement the Levenshtein Distance algorithm
  • Store the dictionnary in a sorted sequence (std::set for example, though a sorted std::deque or std::vector would be better performance wise)

Keys Points:

  • The Levenshtein Distance compututation uses an array, at each step the next row is computed solely with the previous row
  • The minimum distance in a row is always superior (or equal) to the minimum in the previous row

后一种财产允许使用短路:如果你想要将 yourself字限制在2个错误(门槛),那么,如果目前行文的最低点位优于2个,你就可以放弃计算。 一项简单战略是将战区+1作为距离。


1. First Tentative

让我们开始简单。

我们用直线扫描仪:每字我们计算距离(短路),我们列出迄今为止距离较小的词语。

它在小独裁者方面做得很好。


2. 改进数据结构

远距至少等于长短。

通过把双胞胎(宽度,字数)作为钥匙而不是仅仅使用字句,你可以把你的搜索限制在<代码>的长度范围内[宽度-编辑、长度+ edit],并大大减少搜索空间。


3. Prefixes and pruning

为了改进这方面工作,我们可以指出,在我们建立距离矩阵、逐行发展的时候,一个世界完全被扫描(我们所看一字),而另一个世界(指名人)不是:我们只用一封信给各行。

This very important property means that for two referents that share the same initial sequence (prefix), then the first rows of the matrix will be identical.

请你储存字典吗? 也就是说,具有相同先决条件的词语是相邻的。

假设你在<条码>和<条码>上核对你的字句,你在<条码>上看到该字不可行(距离已经太长),那么从<条码>开始的任何字。 或者,只要通过<条码>,你就可以打字。

能力本身可以是直线性的,也可以是搜索的(定义第1字,其序号高于car):

  • linear works best if the prefix is long (few words to skip)
  • binary search works best for short prefix (many words to skip)

“长时间”取决于你的字典,你必须衡量。 我将开始双轨搜索。

注意:长度分区与前缀分区相反,但它会修剪更多的搜索空间


4. 固定和再使用

Now, we ll also try to re-use the computation as much as possible (and not just the "it does not work" result)

Suppose that you have two words:

  • cartoon
  • carwash

您首先将表格(逐行)计算为<条码>。 然后在读到<条码>时,先由>条令/条码>。 您需要确定共同的序号(见car )的长度,并且可以保留矩阵头4行(对应的是空白,c,a,r

Therefore, when begin to computing carwash, you in fact begin iterating at w.

为此,在你开始搜寻时简单地使用一个阵列,使之足以满足更大的参考要求(你应当知道你的字典中最长的长度)。


5. Using a "better" data structure

如果时间较长,可以使用Trie或Patricia树储存dict。 然而,这并不是一个STL数据结构,你需要扩大这一结构,以便在每个子树中储存所储存的字数长度,这样你就不得不自行执行。 这并不像现在这样容易,因为有记忆爆炸问题可以造成当地人死亡。

This is a last resort option. It s costly to implement.

问题回答

你们应该看一下Peter Norvig关于如何写拼写的正确性的解释。

rel=“nofollow” 如何写一个拼写的正确的

EveryThing is well explain in this article, as an example the python code for the spell checker looks like this :

import re, collections

def words(text): return re.findall( [a-z]+ , text.lower()) 

def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

NWORDS = train(words(file( big.txt ).read()))

alphabet =  abcdefghijklmnopqrstuvwxyz 

def edits1(word):
   splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]
   deletes    = [a + b[1:] for a, b in splits if b]
   transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
   replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]
   inserts    = [a + c + b     for a, b in splits for c in alphabet]
   return set(deletes + transposes + replaces + inserts)

def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

def known(words): return set(w for w in words if w in NWORDS)

def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=NWORDS.get)

希望你们能够在彼得·诺维格网站上找到你们所需要的东西。

在许多数据结构中,例如BK-Tree将是有益的。 http://blog.notdot.net/2007/4/Damn-Cool-Algorithms-Part-1-BK-Trees”rel=“nofollow” Damngil Algorithms, Part 1: BK-Trees 我已在以下网站实施:https://github.com/davinash/breathalyzer/blob/master/breathalyzer.cpp“rel=“nofollow”>here。

我早些时候的代码链接可能会误导,

在我的头部之外,你可以根据长处分散建议,并建立一个树木结构,让孩子们更长地变换较短的父母。

守则本身应当相当快,但不能确定,在(++)中,对手法的改动不大。





相关问题
How to add/merge several Big O s into one

If I have an algorithm which is comprised of (let s say) three sub-algorithms, all with different O() characteristics, e.g.: algorithm A: O(n) algorithm B: O(log(n)) algorithm C: O(n log(n)) How do ...

Grokking Timsort

There s a (relatively) new sort on the block called Timsort. It s been used as Python s list.sort, and is now going to be the new Array.sort in Java 7. There s some documentation and a tiny Wikipedia ...

Manually implementing high performance algorithms in .NET

As a learning experience I recently tried implementing Quicksort with 3 way partitioning in C#. Apart from needing to add an extra range check on the left/right variables before the recursive call, ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Enumerating All Minimal Directed Cycles Of A Directed Graph

I have a directed graph and my problem is to enumerate all the minimal (cycles that cannot be constructed as the union of other cycles) directed cycles of this graph. This is different from what the ...

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签