ITPub博客

首页 > > > 分词技术与算法

分词技术与算法

作者:RayChou 时间:2019-12-26 10:41:54 0 删除 编辑

在我们熟悉的汉语中,NLP面临的第一个问题应该就是分词问题。或者准确地说NLP面临的第一个问题就是给文字做量化,因为没有办法用合适的数据来表示文字信息的话,后续的一切建模与计算都将是浮云,分词只是第一步。

分词是汉语处理中一个避免不了的问题。因为汉语的这种“流”式的粘连特点是比较明显的,上一节也曾经提过,汉语在古代典籍中是没有断句,即便到了现代汉语的范畴中,断句也是在分句与分句,句子与句子之间加入了逗号和句号,做了一个非常粗粒度的划分。相比之下,印欧语系的语言就显得利索得多,比如英语,就会用空格把不同的单词分开,所以英语中不存在分词的问题(当然它们有别的问题)。


没有句读的古代碑文


举个例子,“山东东阿阿胶是一种药材。”这个短句是一个主谓宾俱全的短句,可是你说计算机他能明白吗?当然不能,所以需要让计算机帮我们把这个句子划分成:“山东东阿阿胶”、“是”、“一种”、“药材”,这样的一个一个的独立元素才有希望知道这句话究竟是在将谁怎么样,能进行进一步的分析与处理。

你不用担心一个句子的分词会非常难,虽说分词从汉语语法和计算机技术实现的角度来说确实不容易,但好在有一些很趁手的工具是可以帮我们解决这些问题的。这里给大家介绍一个非常好用的小工具,叫做“结巴分词”。

它的项目地址在 https://github.com/fxsjy/jieba,用Python语言的话,pip命令可以直接安装。我这里就简单演示一下在Linux环境下,在有Python3的环境中安装jieba的方法:

pip3 install jieba

如果你想囫囵吞枣式地使用结巴分词工具也是可以的,至少作为入门,很多应用能让你先用起来再说。在它的github主页给了几行代码,用来说明结巴分词的3种工作模式。

# encoding=utf-8
import jieba
seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式
seg_list = jieba.cut("我来到北京清华大学", cut_all=False)
print("Default Mode: " + "/
".join(seg_list))  # 精确模式
seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
print(", ".join(seg_list))

执行后的打印结果:

Full Mode: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
Default Mode: 我/ 来到/ 北京/ 清华大学
他, 来到, 了, 网易, 杭研, 大厦
小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, ,, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

这三种模式分别是:“全模式”、“精确模式”(默认)、“搜索引擎模式”。

从模式上看,“全模式”可以将句中所有可以成词的词语都扫描出来,而且不管切分是不是合理,比如“清华大学”,这里的“华大”从含义上是不能切出来的;

“精确模式”是一种可以把句子里面的词以“不重不漏”的方式切开的,而且尽可能保证认出那些较长的词而非将这些词切开,一般用于语义分析应用中;

“搜索引擎”模式切得非常细,基本上是在“精确模式”的基础上,把比较长的词汇又做了切分,一般用于类似搜索引擎的分词和搜索中。

结巴分词从模式上是这样支持的,给我们提供了很好的接口。不过从分词算法的原理上,我们还是应该做个了解,要知道计算机是怎么帮我们把词分开的,下面介绍几种相关的算法。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69954080/viewspace-3170010/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 5.文档分类
请登录后发表评论 登录
全部评论
现任金山办公软件人工智能组高级AI研发工程师。多年从事机器学习,特别是NLP自然语言处理算法的研究及开发工作。拥有丰富的软件开发经验,以及丰富的人工智能算法训练平台开发经验。

注册时间:2019-11-14

  • 博文量
    71
  • 访问量
    60576