自然语言处理实验—分词算法

最近在学自然语言处理,这是第一个上机实验自然语言处理的分词算法,也是自然语言处理比较入门的算法。和大家分享一下。
首先,自然语言处理,英文是(Nature Language Process),简称“NLP"。是人工智能发展的的热门方向,也是和人交互最为相关的人工智能的应用方向。因为是和人打交道,那么需要以人的交流方式–语言来进行交互。
下面给大家介绍NLP里面最基础的算法–分词算法。

1.词典

一个好的NLP系统一定要有完备的词典,用于判断算法分出的词是否是具有实际意义的词。比如,“吃饭”,“睡觉”等。从而过滤掉那些没有实际意义的词。比如,“的是”,“是吃”等。
目前比较熟著名且成熟的词典有:
搜狗实验室发布的互联网词库(SogouW,其中有15万个词条)
清华大学开放中文词库(THUOCL)
码农场千万级巨型汉语词库(千万级词条)

2.切分算法介绍

这里介绍常用的切分算法,具体分为完全切分、正向最长匹配、逆向最长匹配、双向最长匹配算法。

2.1 完全切分

完全切分指的是,找出一段文本中的所有有意义单词,不是标准意义上的分词。
具体实现在代码实现部分的fully_segment的函数部分

2.2 正向最长匹配

就是说从前往后,递增查词,优先输出更长的单词。
具体实现在代码实现部分的forward_segment的函数部分

2.3 逆向最长匹配

与正向最长匹配相反,从后往前,递减查词,优先输出更长的单词,据统计这种方法更具可靠性。
具体实现在代码实现部分的backward_segment的函数部分

2.4 双向最长匹配

属于对正向最长匹配和逆向匹配的折中方案。属于融合两种匹配方法的复杂规则集,流程如下:
1.同时执行正向最长匹配和逆向最长匹配,若两者的次数不同,则返回次数更少的那一个。
2.如果相等,返回两者中单字更少的那一个,当单子数也相同时,优先返回逆向最长匹配的结果。
具体实现在代码实现部分的all_segment的函数部分

3.代码实现

这里引用了几个经典的例子。读者可以自行修改体验。运行代码时,要输入的句子可以是“项目的研究”“商品和服务”“研究生命起源”“当下雨天地面积水”“结婚的和尚未结婚的”“欢迎新老师生前来就餐”。

def select_word(text):result = 0for i in text:if(len(i)==1):result += 1return result
def fully_segment(text,dic):word_list = []for i in range(len(text)):for j in range(i+1,len(text)+1):word=text[i:j]if word in dic:word_list.append(word)return word_list
def forward_segment(text,dic):word_list = []i = 0while(i<len(text)):longest_word = text[i]for j in range(i+1,len(text)+1):word = text[i:j]if word in dic:if len(word)>len(longest_word):longest_word = wordword_list.append(longest_word)i += len(longest_word)return word_list
def backward_segment(text,dic):word_list = []i = len(text)-1while(i>=0):longest_word = text[i]for j in range(0,i):word = text[j:i+1]if word in dic:if len(word)>len(longest_word):longest_word = wordword_list.insert(0,longest_word)i -= len(longest_word)return word_listdef all_segment(text,dic):list_forward = forward_segment(text,dic)list_backward = backward_segment(text,dic)list_final = []if(len(list_forward)>len(list_backward)):list_final = list_backward[:]elif(len(list_forward)<len(list_backward)):list_final = list_forward[:]else:if(select_word(list_forward)>select_word(list_backward)):list_final = list_backward[:]elif(select_word(list_forward)<select_word(list_backward)):list_final = list_forward[:]else:list_final = list_backward[:]return list_final
dic = [ "项目","研究","目的","商品","服务","和服","研究生","结婚","和尚","结婚","尚未",\"生命","起源","当下","雨天","地面","积水","下雨天","欢迎","老师","生前","就餐","迎新","师生","前来"]if __name__ == "__main__":while(1):a = input("请输入你要分词的句子:(输入0结束输入)")if(a=='0'):print("输入结束!")breakb = fully_segment(a,dic)print("分词的结果",b)list_forward = forward_segment(a,dic)list_backward = backward_segment(a,dic)list_all = all_segment(a,dic)print("正向最长匹配",list_forward)print("逆向最长匹配",list_backward)print("双向最长匹配",list_all)

输出结果分析

序号 原文 正向最长匹配 逆向最长匹配 双向最长匹配
1 项目的研究 [‘项目’, ‘的’, ‘研究’] [‘项’, ‘目的’, ‘研究’] [‘项’, ‘目的’, ‘研究’]
2 商品和服务 [‘商品’, ‘和服’, ‘务’] [‘商品’, ‘和’, ‘服务’] [‘商品’, ‘和’, ‘服务’]
3 研究生命起源 [‘研究生’, ‘命’, ‘起源’] [‘研究’, ‘生命’, ‘起源’] [‘研究’, ‘生命’, ‘起源’]
4 当下雨天地面积水 [‘当下’, ‘雨天’, ‘地面’, ‘积水’] [‘当’, ‘下雨天’, ‘地面’, ‘积水’] [‘当下’, ‘雨天’, ‘地面’, ‘积水’]
5 结婚的和尚未结婚的 [‘结婚’, ‘的’, ‘和尚’, ‘未’, ‘结婚’, ‘的’] [‘结婚’, ‘的’, ‘和’, ‘尚未’, ‘结婚’, ‘的’] [‘结婚’, ‘的’, ‘和’, ‘尚未’, ‘结婚’, ‘的’]
6 欢迎新老师生前来就餐 [‘欢迎’, ‘新’, ‘老师’, ‘生前’, ‘来’, ‘就餐’] [‘欢’, ‘迎新’, ‘老’, ‘师生’, ‘前来’, ‘就餐’] [‘欢’, ‘迎新’, ‘老’, ‘师生’, ‘前来’, ‘就餐’]

自然语言处理实验—分词算法(含python代码及详细例子讲解)相关推荐

  1. 中文分词算法及python代码实现(持续更新中)

    文章目录 1. 机械分词算法 1.1. 正向最大匹配算法 1.2. 逆向最大匹配算法 参考链接: https://blog.csdn.net/lcwdzl/article/details/784936 ...

  2. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  3. 12种降维方法终极指南(含Python代码)

    12种降维方法终极指南(含Python代码) 你遇到过特征超过1000个的数据集吗?超过5万个的呢?我遇到过.降维是一个非常具有挑战性的任务,尤其是当你不知道该从哪里开始的时候.拥有这么多变量既是一个 ...

  4. 一文看懂Stacking!(含Python代码)

    一文看懂Stacking!(含Python代码) https://mp.weixin.qq.com/s/faQNTGgBZdZyyZscdhjwUQ 转载于:https://www.cnblogs.c ...

  5. 感知机算法之Python代码实现

    感知机算法之Python代码实现 1.算法简介 感知机学习算法原始形式: 输入:训练集T 输出:w,b 感知机模型:f(x)=sign(w·x+b) 算法步骤: 1.初始化参数w0,b0 2.在训练集 ...

  6. 分词算法----正向和逆向最大匹配算法(含Python代码实现)

    文章目录 分词算法(Segmentation Method) 最大匹配算法(Maximum Matching) 需要的前提 正向最大匹配算法(Forwards Maximum Match,FMM) 逆 ...

  7. 简易中文分词算法(python)_自然语言处理(NLP)中的的中文分词算法及 Python 实现...

    本 Chat 首先简单介绍了自然语言处理中中文分词的概念和应用场景.然后通过两个简单的小例子展示了算法的步骤.接着编写了 Python 代码,并在<红楼梦>上做了测试.最后,总结了我在写代 ...

  8. BPR贝叶斯个性化推荐算法—推荐系统基础算法(含python代码实现以及详细例子讲解)

    BPR贝叶斯个性化排序算法 一.问题导入 二.显示反馈与隐式反馈 2.1 显式反馈与隐式反馈基本概念 2.2 显式反馈与隐式反馈的比较 2.3 显式反馈与隐式反馈的评价方法 2.3.1 显式反馈数据模 ...

  9. 密码学——保序加密算法(OPE算法-2009年提出)通俗易懂解析(小学生都能懂!)含python代码

    一. 预备知识 保序加密算法:最初是由2009年,Boldyreva等四个人提出来的,可简称BCLO-09算法,论文题目为<Order-Preserving Symmetric Encrypti ...

最新文章

  1. 基本服务-使用大使网关
  2. android布局属性,Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline...
  3. AI释放数字经济潜能!思谋科技受邀出席2021全球数字经济大会
  4. 今日恐慌与贪婪指数为38 恐慌程度明显上升
  5. Struts1.x系列教程(16):使用LocaleAction类实现国际化的Web程序
  6. 软件架构入门,看这篇就够了···
  7. atitit...触发器机制 ltrigger mechanism sumup .的总结O8f
  8. android 连接windows 蓝牙 串口工具_ESP32变身蓝牙串口调试工具 只需几行代码即可实现...
  9. 设置oracle odbc,Oracle Windows ODBC 数据源配置
  10. MATLAB— RGB图像 ==Bayer图像 (bggr, gbrg, grbg, rggb)
  11. c语言程序调试方法有哪些,c语言程序的调试方法有哪些
  12. Httpclient4 简介
  13. jupyter 布尔过滤与数据离散化
  14. 苏大计算机考研 操作系统常见易错知识点整理
  15. 吃鸡神器!新款苹果 iPad,免费送一台!
  16. 第三方服务(文件,图片存储)
  17. 数据结构-栈(栈的C语言实现)
  18. 一位资深HR的职场感言
  19. ERP与MRPⅡ的区别
  20. python flask+apscheduler定时任务导致数据重复和错误

热门文章

  1. 普通的html页面中ie11的兼容性问题
  2. 再来一个小游戏——原生js逐句解释开发简易版别踩白块,附源码
  3. 即席查询之Druid
  4. 肺结节圆形边界光滑_发现了肺结节如何判断良恶性?
  5. 扩充人脉比拿项目乱找VC更为重要
  6. 微信接入微信JS-SDK----签名算法
  7. 基于springboot的员工人事管理系统
  8. Zemax中的优化算法
  9. java正则匹配多个斜杠_正则表达式以匹配JAVA中的两个斜杠
  10. 淘客推广 25%高佣金产品旺季来袭