贝叶斯实现单词纠错----代码篇

今天承接上一篇,手写单词纠错

需要准备语料库- -

代码
'''贝叶斯要解决的问题是  逆概 问题'''
import re,collections
import pandas as pd
txt = ''
csv = 'frequency.csv'
# 获取文本中的英文单词 (作为先验概率的数据) 单词方案1 统计文章中出现的单词的频率
def words(test): return re.findall('[a-z]+', test.lower())
# def train(features):
#     mode1 = collections.defaultdict(lambda :1)
#     for f in features:
#         mode1[f] += 1
#     return mode1
# ---------------------------------------------------------------------------

# 单词方案2 加载词频文本
def train(csv):
    model = collections.defaultdict(lambda :1)
    data = pd.read_csv(csv,header=None,names=['words'],encoding='utf-8')
    for w in range(1,len(data)+1):
        model[data['words'][w-1]] = w
    # print(model)
    return model
#NWORDS = train(words(open(txt).read()))
NWORDS = train(csv)
alphabet = 'abcdefghijklmnopqrstuvwxyz'

# 编辑距离
# 返回所有与单词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) for c in alphabet]       # insetion
    )

# 编辑距离为2
def edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1))

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

# 如果know(set) 非空, candidate 就会选择这个集合,而不会继续计算后面的
def correct(word):
    candidate = know([word]) or know(edits1(word)) or know(edits2(word)) or [word]
    return max(candidate, key=lambda  w : NWORDS[w])

while True:
    a = input("请输入一个单词:")
    print('你可能想输入的单词是 :{}'.format(correct(a)))
    print('-'*20)
需要语料库的下方发邮箱。。。

(来不及解释代码了,快上车。。。。又水一篇,下周解释)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的 MATLAB 贝叶斯 2-Class Problem 的实现代码: ```matlab % 假设有两个类别: A 和 B % x 是一个观察变量,可以是一个向量或矩阵 % muA 和 muB 是 A 和 B 类别的均值,分别是向量或矩阵 % sigma 是两个类别的协方差矩阵,假设相同 function [decision, posteriorA, posteriorB] = bayes2class(x, muA, muB, sigma) % 计算先验概率 priorA = 0.5; priorB = 0.5; % 计算类别 A 和 B 的后验概率 posteriorA = mvnpdf(x, muA, sigma) * priorA; posteriorB = mvnpdf(x, muB, sigma) * priorB; % 做出决策 if posteriorA > posteriorB decision = 'A'; else decision = 'B'; end end ``` 使用方法: ```matlab % 生成一些随机数据 n = 100; muA = [0 0]; muB = [3 3]; sigma = [1 0; 0 1]; xA = mvnrnd(muA, sigma, n); xB = mvnrnd(muB, sigma, n); % 预测一个新的观察值 xNew = [1 1]; [decision, posteriorA, posteriorB] = bayes2class(xNew, muA, muB, sigma); % 绘制决策边界和数据点 x = -5:0.1:8; y = -5:0.1:8; [X,Y] = meshgrid(x,y); Z = zeros(length(x),length(y)); for i = 1:length(x) for j = 1:length(y) xTest = [X(i,j) Y(i,j)]; [decision, posteriorA, posteriorB] = bayes2class(xTest, muA, muB, sigma); if decision == 'A' Z(i,j) = 1; else Z(i,j) = 0; end end end figure hold on scatter(xA(:,1),xA(:,2),'r') scatter(xB(:,1),xB(:,2),'b') contour(X,Y,Z,'LineWidth',1.5) plot(xNew(1),xNew(2),'kx','MarkerSize',10,'LineWidth',2) hold off axis equal ``` 该代码将生成一个决策边界和一些数据点,如下所示: 请注意,这只是一个简单的示例,如果你想要更复杂的实现,需要更多的代码和技能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值