??xml version="1.0" encoding="utf-8" standalone="yes"?>免费观看久久久4p,国产日韩欧美一区在线,欧美精品日韩三级http://www.shnenglu.com/AutomateProgram/category/16810.html当音乐和传说在深夜中沉寂后,E序的每个字W还在蟩动!zh-cnWed, 31 Aug 2011 13:42:16 GMTWed, 31 Aug 2011 13:42:16 GMT60怎样写一个拼写检查器(~写 癑ֺ 您要扄是不?功能 )http://www.shnenglu.com/AutomateProgram/archive/2011/06/25/149446.html漂漂漂漂Sat, 25 Jun 2011 09:29:00 GMThttp://www.shnenglu.com/AutomateProgram/archive/2011/06/25/149446.htmlhttp://www.shnenglu.com/AutomateProgram/comments/149446.htmlhttp://www.shnenglu.com/AutomateProgram/archive/2011/06/25/149446.html#Feedback0http://www.shnenglu.com/AutomateProgram/comments/commentRss/149446.htmlhttp://www.shnenglu.com/AutomateProgram/services/trackbacks/149446.html原文地址Q?a >http://blog.csdn.net/deadspace/archive/2011/02/17/6190810.aspx
上个星期, 我的两个朋友 Dean ?Bill 分别告诉我说他们?Google 的快速高质量的拼写检查工h到惊? 比如说在搜烦的时候键?[speling], 在不?0.1 U的旉? Google 会返? 你要扄是不?[spelling]. (Yahoo! 和微软也有类似的功能). 让我感到有点奇怪的是我原想 Dean ?Bill q两个很牛的工程师和数学家应该对于用统计语a模型构徏拼写查器有职业的敏感. 但是他们g没有q个x. 我后来想了想, 他们的确没什么理由很熟悉l计语言模型. 不是他们的知识有问题, 而是我预想的本来是不对?

我觉? 如果对这斚w的工作做个解? 他们和其他h肯定会受? 然而像Google 的那样工业强度的拼写查器的全部细节只会让人感到迷惑而不是受到启q? 前几天我乘飞机回家的时? Z写了几十行程? 作ؓ一个玩h质的拼写检查器. q个拼写查器大约1 U能处理10 多个单词, q且辑ֈ 80% -90% 的准率. 下面是我的代码, 用Python 2.5 写成, 一?1 ? 是一个功能完备的拼写查器.

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):
    n = len( word)
    return set([ word[ 0 : i]+ word[ i+ 1 :] for i in range( n)] +                      # deletion
               [ word[ 0 : i]+ word[ i+ 1 ]+ word[ i]+ word[ i+ 2 :] for i in range( n- 1 )] + # transposition
               [ word[ 0 : i]+ c+ word[ i+ 1 :] for i in range( n) for c in alphabet] + # alteration
               [ word[ 0 : i]+ c+ word[ i:] for i in range( n+ 1 ) for c in alphabet])   # insertion

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= lambda w: NWORDS[ w])

q段代码定义了一个函数叫 correct , 它以一个单词作入参? q回最可能的拼写徏议结? 比如?

>>> correct( 'speling' )
'spelling'
>>> correct( 'korrecter' )
'corrector'

 

拼写查器的原? 一些简单的概率知识

我简单的介绍一下它的工作原? l定一个单? 我们的Q务是选择和它最怼的拼写正的单词. ( 如果q个单词本n拼写是正确? 那么最相近的就是它自己?. 当然, 不可能绝对的扑ֈ相近的单? 比如说给?lates q个单词, 它应该别更正?late 呢还?latest ? q些困难指示我们, 需要用概率论, 而不是基于规则的判断. 我们? l定一个词 w, 在所有正的拼写词中, 我们惌找一个正的?c, 使得对于 w 的条件概率最? 也就是说:

argmaxc P(c |w )

按照 贝叶斯理?上面的式子等价于:

argmaxc P(w |c ) P(c ) / P(w )

因ؓ用户可以输错M? 因此对于M c 来讲, 出现 w 的概?P(w) 都是一L, 从而我们在上式中忽略它, 写成:

argmaxc P(w |c ) P(c )

q个式子有三个部? 从右到左, 分别?

1. P(c), 文章中出C个正拼写词 c 的概? 也就是说, 在英语文章中, c 出现的概率有多大? 因ؓq个概率完全p语这U语a军_, 我们UC为做语言模型 . 好比? p中出?the 的概?P('the') q寚w, 而出?P('zxzxzxzyy') 的概率接q?( 假设后者也是一个词的话).

2. P(w|c), 在用h键入 c 的情况下敲成 w 的概? 因ؓq个是代表用户会以多大的概率?c 敲错?w, 因此q个被称差模?.

3. argmaxc , 用来枚D所有可能的 c q且选取概率最大的, 因ؓ我们有理q? 一? 正确? 单词出现的频率高, 用户又容易把它敲成另一个错误的单词, 那么, 那个敲错的单词应该被更正个正的.

有h肯定要问, 你笨? Z么把最单的一?P(c |w ) 变成两项复杂的式子来计算? {案是本质上 P(c|w) 是和这两项同时相关? 因此拆成两项反而容易处? 举个例子, 比如一个单?thew 拼错? 看上?thaw 应该是正的, 因ؓ是?a 打成 e ? 然? 也有可能用户惌的是 the, 因ؓ the 是英语中常见的一个词, q且很有可能打字时候手不小心从 e 滑到 w ? 因此, 在这U情况下, 我们惌计算 P(c |w ), 必d时考虑 c 出现的概率和?c ?w 的概? 把一Ҏ成两反而让q个问题更加Ҏ更加清晰.

现在, 让我们看看程序究竟是怎么一回事. 首先是计?P(c), 我们可以d一个巨大的文本文g, big.txt , q个里面大约有几百万个词( 相当于是语料库了). q个文g是由Gutenberg 计划 中可以获取的一些书, Wiktionary ?British National Corpus 语料库构? ( 当时在飞Z我只有福摩斯全? 我后来又加入了一? 直到效果不再显著提高为止).

然后, 我们利用一个叫 words 的函数把语料中的单词全部抽取出来, 转成写, q且去除单词中间的特D符? q样, 单词׃成ؓ字母序列, don't 变?don ?t ?1 接着我们训练一个概率模? 别被q个术语吓? 实际上就是数一数每个单词出现几? ?train 函数? 我们做q个事情.

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()))

实际? NWORDS[w] 存储了单?w 在语料中出现了多次. 不过一个问题是要是遇到我们从来没有q见q的新词怎么? 假如说一个词拼写完全正确, 但是语料库中没有包含q个? 从而这个词也永q不会出现在训练集中. 于是, 我们pq回出现q个词的概率?. q个情况不太? 因ؓ概率? q个代表了这个事件绝对不可能发生, 而在我们的概率模型中, 我们期望用一个很的概率来代表这U情? 实际上处理这个问题有很多成型的标准方? 我们选取一个最单的Ҏ: 从来没有q见q的新词一律假讑և现过一? q个q程一般成?#8221; qx?#8221;, 因ؓ我们把概率分布ؓ0 的设|ؓ一个小的概率? 在语a实现? 我们可以使用Python collention 包中?defaultdict c? q个cd python 标准?dict ( 其他语言中可能称之ؓ hash ? 一? 唯一的不同就是可以给L的键讄一个默认? 在我们的例子? 我们使用一个匿名的 lambda:1 函数, 讄默认gؓ 1.


然后的问题是: l定一个单?w, 怎么能够枚D所有可能的正确的拼写呢? 实际上前人已l研I得很充分了, q个是一个编辑距?的概? q两个词之间的编辑距?br />定义Z用了几次插入( 在词中插入一个单字母), 删除( 删除一个单字母), 交换( 交换盔R两个字母), 替换( 把一个字母换成另一? 的操作从一个词变到另一个词.
下面q个函数可以q回所有与单词 w ~辑距离?1 的集?

def edits1( word):
    n = len( word)
    return set([ word[ 0 : i]+ word[ i+ 1 :] for i in range( n)] +                      # deletion
               [ word[ 0 : i]+ word[ i+ 1 ]+ word[ i]+ word[ i+ 2 :] for i in range( n- 1 )] + # transposition
               [ word[ 0 : i]+ c+ word[ i+ 1 :] for i in range( n) for c in alphabet] + # alteration
               [ word[ 0 : i]+ c+ word[ i:] for i in range( n+ 1 ) for c in alphabet])   # insertion

昄, q个集合很大. 对于一个长度ؓ n 的单? 可能有n U删? n-1 中对? 26n U?( 译注: 实际上是 25n U? 替换 ?26(n+1) U插?( 译注: 实际上比q个? 因ؓ在一个字母前后再插入q个字母构成的词是等L). q样的话, 一共就?54n + 25 中情?( 当中q有一炚w?. 比如? ?something q个单词的编辑距Mؓ1 的词按照q个来?511 ? 而实际上?494 ?

一般讲拼写查的文献宣称大约80-95% 的拼写错误都是介于编译距?1 以内. 然而下面我们看? 当我对于一个有270 个拼写错误的语料做实验的时? 我发现只?6% 的拼写错误是属于~辑距离? 的集? 或许是我选取的例子比典型的例子难处理一点吧. 不管怎样, 我觉得这个结果不够好, 因此我开始考虑~辑距离?2 的那些单词了. q个事情很简? 递归的来? 是?edit1 函数再作用在 edit1 函数的返回集合的每一个元素上p? 因此, 我们定义函数 edit2:

def edits2( word):
    return set( e2 for e1 in edits1( word) for e2 in edits1( e1))

q个语句写v来很? 实际上背后是很庞大的计算? ?something ~辑距离? 的单词居然达C 114,324 ? 不过~辑距离攑֮? 以后, 我们基本上就能覆盖所有的情况? ?70 个样例中, 只有3 个的~辑距离大于2. 当然我们可以做一些小的优化: 在这些编辑距d? 的词中间, 只把那些正确的词作ؓ候选词. 我们仍然考虑所有的可能? 但是不需要构Z个很大的集合, 因此, 我们构徏一个函数叫?known_edits2 , q个函数只返回那些正的q且?w ~辑距离于2 的词的集?

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

现在, 在刚才的 something 例子? known_edits2('something') 只能q回 3 个单? 'smoothing', 'something' ?'soothing', 而实际上所有编辑距Mؓ 1 或?2 的词一共有 114,324 ? q个优化大约把速度提高?10%.

最后剩下的是误差模型部分 P(w |c ) ? q个也是当时难住我的部分. 当时我在飞机? 没有|络, 也就没有数据用来构徏一个拼写错误模? 不过我有一些常识性的知识: 把一个元x成另一个的概率要大于辅?( 因ؓ人常常把 hello 打成 hallo q样); 把单词的W一个字母拼错的概率会相对小, {等. 但是我ƈ没有具体的数字去支撑q些证据. 因此, 我选择了一个简单的Ҏ: ~辑距离? 的正单词比~辑距离? 的优先? 而编辑距Mؓ0 的正单词优先比编辑距Mؓ1 的高. 因此, 用代码写出来是:

( 译注: 此处作者用了Python 语言的一个y妙性质: 短\表达? 在下面的代码? 如果known(set) 非空, candidate ׃选取q个集合, 而不l箋计算后面? 因此, 通过Python 语言的短路表辑ּ, 作者很单的实现了优先)

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= lambda w: NWORDS[ w])

correct 函数从一个候选集合中选取最大概率的. 实际? 是选取有最?P(c ) 值的那个. 所有的 P(c) 值都存储?NWORDS l构?

效果

现在我们看看法效果怎么? 在飞Z我尝试了好几个例? 效果q行. 飞机着陆后, 我从牛|文本案?(Oxford Text Archive) 下蝲?Roger Mitton ?Birkbeck 拼写错误语料?. 从这个库? 我取Z两个集合, 作ؓ我要做拼写检查的目标. W一个集合用来作为在开发中作ؓ参? W二个作为最后的l果试. 也就是说, 我程序完成之前不参考它, 而把E序在其上的试l果作ؓ最后的效果. 用两个集合一个训l一个对照是一U良好的实践, 臛_q样可以避免我通过对特定数据集合进行特D调整从而自ƺ欺? q里我给Z一个测试的例子和一个运行测试的例子. 实际的完整测试例子和E序可以参见 spell.py .

代码下蝲Q?br />本文来自CSDN博客Q{载请标明出处Q?a >http://blog.csdn.net/deadspace/archive/2011/02/17/6190810.aspx



漂漂 2011-06-25 17:29 发表评论
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            ޹Ʒva| þһ| һþþ| պŷ| ҹƷþþþþþ99ӣ| ŷ| ʾƷŷƷ| ޹91Ʒ߹ۿ| ŷƷպһ| ҹƷþþþþ| ŷһ| ޾Ƶ| ҹԴ̼ӰԺ| þۺ| һþۺ| ߹ۿղƷ| ޾Ʒ߲| ƷվƵ| ŷvavaպaۺɫ| ŷŷȫ| þ޾Ʒ| ŷƵ߹ۿ| þӰӾƷ| ŷƵ߲| þþþþ޾ƷĻ| ŷɫ| þþwwwѾƷ| ŷһ߹ۿ| ŷһ| ˲Ůŷ| þþƷ2019Ļ| ŷպɫһ| ŷ˾ƷƵ߹ۿ | þþƷƵ| ŷպѡ| ŷһƷ| һƵ| ޾Ʒһӣ| һ| һavӰ| 91þþþþþþ| þþþþ޾ƷĻ| СƵ| ŷƷһ| avԾþþþa| Ʒ߿| ҹһ| һƵ߿| avһ| þۺϾþۺϾþ| 鶹ۺ| Ƶ߹ۿ| һۺ| ŷպһ| ŷѹۿ| ߹ۿһ| þþþþ޾Ʒ4k| þþþþþþۺ| ŷƷxxxx| ҹƷ| þü¶| պһ| ŷһƵ߹ۿ2020 | һ޾Ʒ| ŷպƵ| ŷպһ߹ۿ| ŷƵһ߹ۿ| ޹Ƶһ| 99reƷ| Ʒʵ¶| ҹҹavһվļav | Ʒþþþ91| ֻƵ| þþƷҳ| ɫɫۺϾþ| ѳav| պҹĻ| Ӱһ| ھƷŮav߲| þȷԴ| ޺˿һ| һѹۿ | ֻƵƷ| þӰԺ| ŮƷһ| ŷһպһ| ݺɫþۺ϶| 鶹ƷҺ| Ů߹ۿ| þþƷһ| Ƶ| պƷӰ| ŷ պ | ߹ۿ| ˾ҹƷƵ| һþ| Բ͵ľƷƵ͵| ŷƷһ߲| | ŷ4ҳ| ŷ8khd弫Ʒ| ޼ӰĻ| Ʒ| ŷպһ| ŷ˾þþþþҹþþþ | þþþһ| պgay| ߹ۿպav| ƷþþþþëƬ| þ޹| ۺϾƷ| 9iƬѸ| ŷƬ߿ѹۿ| ŷһ߿| 9iƬѸ| Ƶ| ŷպƷ| ŷպ| ŷxxx߹ۿ| þþþþҹ| þþþþþþ| ҹɫһ| ޾ƷԴŮ¾Ƶ| ŷƵһ| þþþùɫavѹۿɫ| ҹƷ| ֻоƷӰ| ŷպƷ߹ۿ| ŷ69av| Ұŷxxxx| þպһ| ɫƷ| ŷһߵӰ | պ߹ۿ| þҹҹݺ2022 | ³avվ| ޼žž| ޾ƷƷԲۿ| Ʒ69Ƶһ| պŷһ| һ| ŮƷˬ| ŷƷþ| վŷպѾƷ߹ۿ | ŷƬxxxxѿð| ŷպַ| Ʒ9718| Ʒѹۿ| ƷĻŷ| һƵ߹ۿ | ŷպƷ| ŷպŮ| ɫ91| ŮƵ| Ů| þþavëƬƷ| ŷ| ŮѾƷƵ߹ۿ| 9reƵ߾Ʒ| ŷպ| þùƵ| ŷ91Ƶ| Ʒa| Ʒ| ޹Ƶ߹ۿ| ޾Ʒ| ŷۺ| ѹۿ| һþaþѾƷ| ҹƵ| 鶹߲| ŷҹ| ߹ۿһƵ| avͼƬ| þ޾ƷƷС˵| 91þþ| ŷһ߹ۿ| ŮƵһ| ƷƵƷƵ| ޹Ʒ˾þۺһ| լ66ձŷƵ| þþùƵ91| պ㽶Ƶ| þþþþɫ| Ʒһa| ³| þþŷƷ| 99ƵƷѹۿ| þþƷ| Ʒ| ˳7777| þۺɫ88| ҹƷƵ߹ۿһ| ŷjizz19ŷ| Ƶվ| ۺƵ1| ƨӽ8| ˾a߾Ʒ| ŷպһ| Ƶۺ|