91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Python編寫一個拼寫糾錯器

發布時間:2022-01-18 15:50:48 來源:億速云 閱讀:195 作者:iii 欄目:編程語言

這篇文章主要介紹“怎么用Python編寫一個拼寫糾錯器”,在日常操作中,相信很多人在怎么用Python編寫一個拼寫糾錯器問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Python編寫一個拼寫糾錯器”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

代碼如下:

Python

# coding:utf-8

 

import re

from collections import Counter

 

 

def words(text):

    return re.findall(r'\w+', text.lower())

 

# 統計詞頻

WORDS = Counter(words(open('big.txt').read()))

 

 

def P(word, N=sum(WORDS.values())):

    """詞'word'的概率"""

    return float(WORDS[word]) / N

 

 

def correction(word):

    """最有可能的糾正候選詞"""

    return max(candidates(word), key=P)

 

 

def candidates(word):

    """生成拼寫糾正詞的候選集合"""

    return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])

 

 

def known(words):

    """'words'中出現在WORDS集合的元素子集"""

    return set(w for w in words if w in WORDS)

 

 

def edits1(word):

    """與'word'的編輯距離為1的全部結果"""

    letters    = 'abcdefghijklmnopqrstuvwxyz'

    splits     = [(word[:i], word[i:])     for i in range(len(word) + 1)]

    deletes    = [L + R[1:]                for L, R in splits if R]

    transposes = [L + R[1] + R[0] + R[2:]  for L, R in splits if len(R) > 1]

    replaces   = [L + c + R[1:]            for L, R in splits for c in letters]

    inserts    = [L + c + R                for L, R in splits for c in letters]

    return set(deletes + transposes + replaces + inserts)

 

 

def edits2(word):

    """與'word'的編輯距離為2的全部結果"""

    return (e2 for e1 in edits1(word) for e2 in edits1(e1))

函數correction(word)返回一個最有可能的糾錯還原單詞:

Python

>>>correction('speling')

'spelling'

>>>correction('korrectud')

'corrected'

它是如何工作的:Python部分

該程序的4個部分:
1.選擇機制:在Python中,帶key的max()函數即可實現argmax的功能。
2.候選模型:先介紹一個新概念:對一個單詞的簡單編輯是指:刪除(移除一個字母)、置換(單詞內兩字母互換)、替換(單詞內一個字母改變)、插入(增加一個字母)。函數edits1(word)返回一個單詞的所有簡單編輯(譯者:稱其編輯距離為1)的集合,不考慮編輯后是否是合法單詞:

Python

def edits1(word):

    """與'word'的編輯距離為1的全部結果"""

    letters    = 'abcdefghijklmnopqrstuvwxyz'

    splits     = [(word[:i], word[i:])     for i in range(len(word) + 1)]

    deletes    = [L + R[1:]                for L, R in splits if R]

    transposes = [L + R[1] + R[0] + R[2:]  for L, R in splits if len(R) > 1]

    replaces   = [L + c + R[1:]            for L, R in splits for c in letters]

    inserts    = [L + c + R                for L, R in splits for c in letters]

    return set(deletes + transposes + replaces + inserts)

這個集合可能非常大。一個長度為n的單詞,有n個刪除編輯,n?1個置換編輯,26n個替換編輯,26(n+1)的插入編輯,總共54n+25個簡單編輯(其中存在重復)。例如:

Python

>>>len(edits1('something'))

442

然而,如果我們限制單詞為已知(known,譯者:即存在于WORDS字典中的單詞),那么這個單詞集合將顯著縮小:

Python

def known(words):

    """'words'中出現在WORDS集合的元素子集"""

    return set(w for w in words if w in WORDS)

 

>>>known(edits1('something'))

['something', 'soothing']

我們也需要考慮經過二次編輯得到的單詞(譯者:“二次編輯”即編輯距離為2,此處作者巧妙運用遞歸思想,將函數edits1返回集合里的每個元素再次經過edits1處理即可得到),這個集合更大,但仍然只有很少一部分是已知單詞:

Python

def edits2(word):

    """與'word'的編輯距離為2的全部結果"""

    return (e2 for e1 in edits1(word) for e2 in edits1(e1))

 

>>> len(set(edits2('something'))

90902

 

>>> known(edits2('something'))

{'seething', 'smoothing', 'something', 'soothing'}

 

>>> known(edits2('somthing'))

{'loathing', 'nothing', 'scathing', 'seething', 'smoothing', 'something', 'soothing', 'sorting'}

我們稱edits2(w)結果中的每個單詞與w的距離為2。

3.語言模型:我們通過統計一個百萬級詞條的文本big.txt中各單詞出現的頻率來估計P(w),它的數據來源于古騰堡項目中公共領域的書摘,以及維基詞典中頻率最高的詞匯,還有英國國家語料庫,函數words(text)將文本分割為詞組,并統計每個詞出現的頻率保存在變量WORDS中,P基于該統計評估每個詞的概率:

Python

def words(text):

    return re.findall(r'\w+', text.lower())

 

 

# 統計詞頻

WORDS = Counter(words(open('big.txt').read()))

 

 

def P(word, N=sum(WORDS.values())):

    """詞'word'的概率"""

    return float(WORDS[word]) / N

可以看到,去重后有32,192個單詞,它們一共出現1,115,504次,”the”是出現頻率最高的單詞,共出現79,808次(約占7%),其他詞概率低一些。

Python

>>> len(WORDS)

32192

 

>>> sum(WORDS.values())

1115504

 

>>> WORDS.most_common(10)

[('the', 79808),

('of', 40024),

('and', 38311),

('to', 28765),

('in', 22020),

('a', 21124),

('that', 12512),

('he', 12401),

('was', 11410),

('it', 10681),

('his', 10034),

('is', 9773),

('with', 9739),

('as', 8064),

('i', 7679),

('had', 7383),

('for', 6938),

('at', 6789),

('by', 6735),

('on', 6639)]

 

>>> max(WORDS, key=P)

'the'

 

>>> P('the')

0.07154434228832886

 

>>> P('outrivaled')

8.9645577245801e-07

 

>>> P('unmentioned')

0.0

4.錯誤模型:2007年坐在機艙內寫這個程序時,我沒有拼寫錯誤的相關數據,也沒有網絡連接(我知道這在今天可能難以想象)。沒有數據就不能構建拼寫錯誤模型,因此我采用了一個捷徑,定義了這么一個簡單的、有缺陷的模型:認定對所有已知詞距離為1的編輯必定比距離為2的編輯概率更高,且概率一定低于距離為0的單詞(即原單詞)。因此函數candidates(word)的優先級如下:
1. 原始單詞(如果已知),否則到2。
2. 所有距離為1的單詞,如果為空到3。
3. 所有距離為2的單詞,如果為空到4。
4. 原始單詞,即使它不是已知單詞。

到此,關于“怎么用Python編寫一個拼寫糾錯器”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和平县| 柳林县| 通海县| 宿松县| 咸阳市| 齐齐哈尔市| 桂东县| 灵台县| 合川市| 洞口县| 阜阳市| 白沙| 大姚县| 龙南县| 达拉特旗| 北川| 宝应县| 高碑店市| 安龙县| 宿迁市| 广元市| 宁化县| 民乐县| 巴彦淖尔市| 大兴区| 闽清县| 肥城市| 宾阳县| 遵义市| 霍城县| 黄大仙区| 昌邑市| 拜城县| 博野县| 东乌珠穆沁旗| 汉源县| 张掖市| 庆阳市| 神农架林区| 正安县| 新泰市|