一.spell correction(拼写错误纠正)

1. 错写的单词与正确单词的拼写相似,容易错写;这里safari是否容易错写成saferi需要统计数据的支持;为了简化问题,我们认为字形越相近的错写率越高,用编辑距离来表示。字形相近要求单词之间编辑距离小于等于2,这里saferi与safari编辑距离为1,后面我们再具体了解编辑距离的定义。

2. 正确单词有很多,除去语义因素外最有可能的单词,也就是这个单词的使用频率了。所以我们确认的标准还有一项就是,单词使用频率。

下面介绍一个机器学习拼写检查方法,基于贝叶斯定理的拼写检查法,主要思想就是上面2条,列举所有可能的正确拼写,根据编辑距离以及词频从中选取可能性最大的用于校正。

原理:

用户输入的错误的单词记做w,用户想要输入的拼写正确的单词记做c,则

P(c | w) : 用户输错成w时,想要的单词是c的概率。

P(w | c) :   用户将c错写成w的概率,与编辑距离有关。

P(c) :    正确词是c的概率,可以认为是c的使用频率,需要数据训练。

根据贝叶斯公式

P(c | w) = P(w | c) * P(c) / P(w)

因为同一次纠正中w是不变的,所以公式中我们不必理会P(w),它是一个常量。比较 P(c | w) 就是比较 P(w | c) * P(c) 的大小。

1)、P(c)

P(c)替换成“使用频率”,我们从足够大的文本库(词典)点击打开链接中统计出各个单词的出现频率,也可以将频率归一化缩小方便比较。

2)、P(w | c)

P(w | c)替换成常数lambda * editDist

editDist编辑距离只计算editDist = 1与editDist = 2的,

editDist1,编辑距离为1的有下面几种情况:

(1)splits:将word依次按照每一位分割成前后两半。比如,'abc'会被分割成 [('', 'abc'), ('a', 'bc'), ('ab', 'c'), ('abc', '')] 。

  (2)beletes:依次删除word的每一位后、所形成的所有新词。比如,'abc'对应的deletes就是 ['bc', 'ac', 'ab'] 。

  (3)transposes:依次交换word的邻近两位,所形成的所有新词。比如,'abc'对应的transposes就是 ['bac', 'acb'] 。

  (4)replaces:将word的每一位依次替换成其他25个字母,所形成的所有新词。比如,'abc'对应的replaces就是 ['abc', 'bbc', 'cbc', ... , 'abx', ' aby', 'abz' ] ,一共包含78个词(26 × 3)。

  (5)inserts:在word的邻近两位之间依次插入一个字母,所形成的所有新词。比如,'abc' 对应的inserts就是['aabc', 'babc', 'cabc', ..., 'abcx', 'abcy', 'abcz'],一共包含104个词(26 × 4)。

editDist2则是在editDist1得到的单词集合的基础上再对它们作以上五种变换,得到所有编辑距离为2的单词(无论是否存在,在词典中不存在的记P(c) = 1)。

import re
from collections import Counterdef words(text): return re.findall(r'\w+', text.lower())WORDS = Counter(words(open('big.txt').read()))def P(word, N=sum(WORDS.values())): "Probability of `word`."return WORDS[word] / Ndef correction(word): "Most probable spelling correction for word."return max(candidates(word), key=P)def candidates(word): "Generate possible spelling corrections for word."return (known([word]) or known(edits1(word)) or known(edits2(word)) or [word])def known(words): "The subset of `words` that appear in the dictionary of WORDS."return set(w for w in words if w in WORDS)def edits1(word):"All edits that are one edit away from `word`."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 if R 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): "All edits that are two edits away from `word`."return (e2 for e1 in edits1(word) for e2 in edits1(e1))

http://norvig.com/big.txt

还有现成的python库:

pip install pyenchant

具体用法:

http://pythonhosted.org/pyenchant/tutorial.html

二、Filtering words(停用词)

import jieba#分词
def stripdata(Test):# jieba 默认启用了HMM(隐马尔科夫模型)进行中文分词seg_list = jieba.cut(Test,cut_all=True)  # 分词#获取字典,去除停用词line = "/".join(seg_list)word = stripword(line)#print(line)#列出关键字print("\n关键字:\n"+word)#停用词分析
def stripword(seg):#打开写入关键词的文件keyword = open('key_word.txt', 'w+', encoding='utf-8')print("去停用词:\n")wordlist = []#获取停用词表stop = open('stopword.txt', 'r+', encoding='utf-8')stopword = stop.read().split("\n")#遍历分词表for key in seg.split('/'):#print(key)#去除停用词,去除单字,去除重复词if not(key.strip() in stopword) and (len(key.strip()) > 1) and not(key.strip() in wordlist) :wordlist.append(key)print(key)keyword.write(key+"\n")#停用词去除ENDstop.close()keyword.close()return '/'.join(wordlist)def creat():Rawdata = open('raw.txt','r+',encoding='utf-8')text = Rawdata.read()#调用分词stripdata(text)#ENDRawdata.close()

NLP初学-文本预处理相关推荐

  1. 【NLP】文本预处理:删除单词停用词

    作者 | Chetna Khanna 编译 | VK 来源 | Towards Data Science 我们很清楚这样一个事实:计算机可以很容易地处理数字. 然而,我们掌握的大部分信息都是以文本的形 ...

  2. (NLP)文本预处理

    目录 读取文本数据集 分词 词表 文本预处理的基本步骤包括以下几个: 将文本作为字符串加载到内存中. 将字符串拆分为词元(如单词和字符). 建立一个词表,将拆分的词元映射到数字索引. 将文本转换为数字 ...

  3. NLP之文本预处理详解

    入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删. Ps预防针:与英文分类文本预处理相比,中文分类文本预处理更加复杂关键 目录 一.进行文本预处理 ...

  4. NLP之文本预处理与特征工程——停顿词与词的过滤(2)

    在NLP应用中,通常需要对文本中的停用词.出现频率很低的词汇过滤掉,这类似于特征筛选. 停顿词和低频词 停顿词:对于理解文章或者句子没有太大意义的词.这些词实际上是任何语言中最常见的词(如冠词.介词. ...

  5. NLP任务中的文本预处理步骤、工具和示例

    作者 | Viet Hoang Tran Duong 来源 | DeepHub IMBA 头图 | CSDN付费下载于视觉中国 数据是新的石油,文本是我们需要更深入钻探的油井.文本数据无处不在,在实际 ...

  6. 使用Stanford NLP software进行中文文本预处理

    中文文本预处理的几个主要步骤有: 中文分词,词性标注,生成词向量,生成中文依存语法树. Stanford NLP software是Stanford NLP小组提供的一个NLP处理工具集合,部分工具支 ...

  7. NLP文本预处理:步骤、示例 | 附github源码

    点击关注我哦 一篇文章带你了解NLP文本预处理:步骤.示例 | 附github源码 注:关注[小白玩转Python]公众号,后台回复[NLP文本预处理],可以获取完整源码以及项目所需数据集. 文本数据 ...

  8. 自然语言处理(NLP)入门(3)——文本预处理

    **数据和特征决定了机器学习的上限,而模型和算法只是无线逼近这个上限.**正是因为数据处理的重要性,在NLP算法的工作中,大部分的时间是与数据打交道,文本预处理更是重中之重! 文本预处理 方法: 文本 ...

  9. NLP | 文本预处理

    一.文本预处理 作用:文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求,如:将文本转化成模型需要的张量,规范张量的尺寸等,而且科学的文本预处理环节还将有效指导模型超参数的选择, ...

最新文章

  1. P2P Device Discovery流程分析
  2. Linux一行命令处理批量文件
  3. java学习笔记—EL表达式(38)
  4. hdu---5455---fang fang
  5. List, Stack, and Queue
  6. c语言使用未初始化的内存怎么解决_C语言快速入门——数组与调试进阶
  7. CSS 文本装饰 text-decoration属性
  8. java过滤集合数量,java – 使用lambdaj过滤集合
  9. 用c#语言制作ktv点歌系统,KTV点歌系统的设计与实现的设计和实现(C#,C/S,Access)
  10. android rom制作教程,【图片】ROM助手:任意安卓机型的ROM制作教程【a298t吧】_百度贴吧...
  11. 分区模式:MBR和GPT
  12. Python练习题——第六题:编写函数计算弧长的计算公式。弧长计算公式是一个数学公式,为L=n(圆心角度数)× π×2 r(半径)/360(角度制)。其中n是圆心角度数,r是半径,L是圆心角弧长。
  13. The Preliminary Contest for ICPC Asia Nanjing 2019
  14. 视频的上传及购买播放
  15. 1823. 找出游戏的获胜者
  16. Ik分词器(自定义分词-mysql)
  17. 数据库系统教程——数据库概论(一)
  18. 为什么WIFI信号较差的时候,网速会比较慢
  19. 读取MDL文件与骨骼控制
  20. 高超声速飞行器俯仰通道滑模控制器设计

热门文章

  1. Linux:NFS服务器
  2. 韩顺平c语言视频笔记,韩顺平视频笔记
  3. 论文推荐 | 综述:自动驾驶背景下的交通流模型研究
  4. CGB2107-Day03-mybatis
  5. 运维小白的python之路(一)
  6. mysql与oracle实现行转列并指定分隔符
  7. 【屌丝之作】3D遥控坦克大战
  8. 数组反转,Java实现
  9. FFmpeg进行音频的解码和播放
  10. 网易2018校园招聘编程题真题集合3字符串碎片