关于分词(词项,词典)

在前一篇中的倒排索引介绍中, 我们了解到要把一篇文档(或者在电商业务中一个商品相关信息)放入索引系统中, 要对该文档的关键词进行提取分析出来后建立相应的倒排列表. 现在问题来了, 我们怎么从一篇文档中抽出所有以前可能要索引的词. 比如一个显示器的标题是 "三星显示器S22D300NY 21.5寸 LED液晶显示器完美屏 替代S22C150N", 那么用户可能在系统中通过输入"三星显示器"或者"S22D300NY"或者"21.5寸"后, 都能正确返回这个显示器的信息. 这就是所谓的分词, 或者词条化技术.

基于分词在不同的语言中, 所要解决的难点问题是不同的. 拿我们知道的英语和汉语来说. 英语的分词看起来简单, 比如 "i love you! " , 我们完全可以根据空格抽出三个词: i, love, you. 但是也有一些复杂的情况要考虑, 如果 i , me ,my 其实他们表达的意思差不多, 用户希望输入 i 的时候,  相关的文档也可以查询出来. 还有一些单复数, 名词/形容词/副词 的形式转化, 而汉语分词的难道是断词, 因为我们的语言是没有空格的, 一句话所有的字全挤在一起, 如"工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作" , 如果让计算机分词的话, 通过怎么样的算法能抽取出满足我们需求的词项呢? 如果分析出一些敏感词(你懂的)肯定不是我们想要的. 所以针对不同的语言,  因为语言自身的特性, 导致它们的难点完全不同(有的文字还是从右往左写的). 我们也只重点关注英文和汉语的问题.

在英语中, 对词的不同形态进行统一, 叫做词干还原(stemmin), 实现这有很多算法, 被证实效率较高, 使用较广的是Porter算法.  可以在lucene中找到相关的java实现代码: org.apache.lucene.analysis.en.PorterStemmer.

汉语的分词其实也是比较复杂的, 也有很多不同的方法, google下"中文分词"会有很多介绍. lucene中也有相关的实现: analyzers-smartcn. 这里我们以: jieba分词 来介绍下中文分词的思路.  可以分为三步: 准备词典; 抽取所有组成词语的组合; 找出最优(最好)的一组.

词典加载

既然中文语法是没有空格加以断词, 那么我们肯定事先把可能的所有词语都准备好.jieba中通过Trie树结构保存所有的词语, 这样可以在分析句子时高速扫描出所有包含的词语.

用夏变夷 3 nz
用天因地 3 l
用头巾包 3 l
用奴用 3 n
用字 29 n
用字不当 3 l
用学 10 n
用家 3 n
用尽 110 v
用尽心机 3 l
用尽方法 3 l
用工 117 n
用工夫 5 n
用布 241 v
用度 49 n
用当其用 3 l

每一个词语载入Trie树的逻辑如下:

def load(word):
    p = trie
    for c in word:
        if c not in p:
            p[c] ={}
        p = p[c]

分析句子,生成所有的词组合

有了Trie树, 解析一个句子中所有的词组合是很容易的, 在jieba分词中用一个DAG(有向图)来表达这个结构. 我们举例说明下, 现在有一个这样的句子: "买水果然后来世博园". 通过扫描前面的Trie树, 可以得到如下词语组合:

买 / 水果 / 果然 / 然后 / 后来 / 来世 / 世博 / 世博园 / 博园

计算最优组合

接着上面的例子, 我们得到"买 / 水果 / 果然 / 然后 / 后来 / 来世 / 世博 / 世博园 / 博园"这些词, 但是显然这只是简单的把所有可能的词全部罗列出来, 但是根据这个句子的语境, 其实我们更想得到这样的组合:

买 / 水果 / 然后 / 来 / 世博园

在jieba分词, 使用的原理是: 通过每个词的出现概率, 来计算基于这个句子的所有切分组合中总概率最大的一个组合, 这是典型的动态规划计算模型. 用个图来说明下这个模型:

我们通过动态规划算法计算一条最大概率的路径即是最优组合:

def calc(sentence,DAG,idx,route):
    N = len(sentence)
    route[N] = (0.0,‘‘)
    for idx in xrange(N-1,-1,-1):
        candidates = [ ( FREQ.get(sentence[idx:x+1],min_freq) + route[x+1][0],x ) for x in DAG[idx] ]
        route[idx] = max(candidates)

这是jieba分词中动态规划的逻辑代码, 也算很简洁了(python写的代码果然很牛). 到止我们已经完成了分析的基本功能.

------------------------EOF

关于分词(词项,词典),布布扣,bubuko.com

时间: 2024-11-18 15:02:37

关于分词(词项,词典)的相关文章

信息检索导论学习笔记 -- 第二章:词项词典及倒排记录表

2.1.1 文档分析及编码转换:      文档处理第一步,是将文件或web服务器上的一系列二进制字节序列转换为字符序列.      在实际中,首先要判断出文档的编码方式(机器学习分类.启发式等方法),确定文档的类型(word?zip?)然后将字节序列转换成字符序列. 2.1.2 文档单位(document unit)的选择:      常见的,将某个目录下的每个文件都看成一个文档.      但有些情况并非如此,比如我们可能希望将邮件.附件(附件中的文件)分开.      对于一个长文档而言,

mmseg自定义分词词库

下面给大家介绍一下如何打造自己的coreseek分词词库. coreseek自身带的词库不是很大,直接使用它分词可能会返回大量没用结果.要想搜索结果准确打造一个专门的分词 词库必不可少. i. 首先到搜狗http://pinyin#sogou#com/dict/下载你要的词库 ii. 因为下载回来的词库不是文本文件我们不能直接使用,所以要先转换成文本文件.网上找一个搜狗转 google的小工具,用它把你下载的全部词库转成文本文件.合并为一个文件命名为words.txt.文件要用utf8编码 保存

打造自己的coreseek分词词库

下面给大家介绍一下如何打造自己的coreseek分词词库. coreseek自身带的词库不是很大,直接使用它分词可能会返回大量没用结果.要想搜索结果准确打造一个专门的分词 词库必不可少. i. 首先到搜狗http://pinyin#sogou#com/dict/下载你要的词库 ii. 因为下载回来的词库不是文本文件我们不能直接使用,所以要先转换成文本文件.网上找一个搜狗转 google的小工具,用它把你下载的全部词库转成文本文件.合并为一个文件命名为words.txt.文件要用utf8编码 保存

solr 分词词库管理思路

大概有以下几种思路: 1. 自定义 SolrRequestHandler 由 SolrRequestHandler 来进行对分词器,进行A)词库加载B)动态添加词库 等操作 这样的话,还需要在内存中hold 住所有的词,或者需要引用到分词的jar 2. 在自定义分词器中实现从文件拉取 对词库文件设置FileWatcher,只要文件有变更,就重新加载一遍词库. 这个成本比较高. 3.  在自定义分词器中实现从db拉取,本地文件备份. 这样的话,需要实现定时拉取,另外,solr初次启动的时候,最好不

solr学习文档之添加分词词库

在上一篇文章中我们学习了solr的快速入门和针对mysql数据库建立索引,今天我们介绍如何为solr添加中文分词 1.  在百度搜索ik-analyzer,找到后下载,我下载的是[IKAnalyzer 2012FF_hf1.zip],解压后会看到如下目录 2.  把IKAnalyzer2012FF_u1.jar拷贝到webapps下solr的lib文件夹下,把IKAnalyzer.cfg.xml和stopword.dic拷贝到solr的conf目录中 3.  修改schema.xml文件,增加如

Lucene的分析过程

转自:http://www.open-open.com/lib/view/open1348033848724.html Lucene的分析过程 回顾倒排索引的构建 收集待建索引的原文档(Document) 将原文档传给词条化工具(Tokenizer)进行文本词条化 将第二步得到的词条(Token)传给语言分析工具(Linguistic modules)进行语言学预处理,得到词项(Term) 将得到的词项(Term)传给索引组件(Indexer),建立倒排索引 注:详细文档->倒排索引的理论过程见

Atitit.数据检索与网络爬虫与数据采集的原理概论

1. 信息检索1 1.1. <信息检索导论>((美)曼宁...)[简介_书评_在线阅读] - dangdang.html1 1.2. <现代信息检索(原书第2版)(由信息检索领域的代表人物撰写,及时掌握现代信息检索关键主题的详细知识)>((智)贝泽耶茨...)2 2. 网络爬虫2 2.1. 第8章 web爬取1993 2.2. <用Python写网络爬虫>([澳]理查德...)3 3. 数据采集4 3.1. <Python网络数据采集>(...)[简介_书评

Lucene使用IKAnalyzer分词实例 及 IKAnalyzer扩展词库

文章转载自:http://www.cnblogs.com/dennisit/archive/2013/04/07/3005847.html 方案一: 基于配置的词典扩充 项目结构图如下: IK分词器还支持通过配置IKAnalyzer.cfg.xml文件来扩充您的专有词典.谷歌拼音词库下载: http://ishare.iask.sina.com.cn/f/14446921.html?from=like在web项目的src目录下创建IKAnalyzer.cfg.xml文件,内容如下 <?xml v

和我一起开发Android应用(三)——“悦词-i背单词”词典功能实现

接上一讲.本节我们把词典功能基本实现,首先上一个效果图,我发现大家比较关心界面方面的东西,我之前写的一个关于QQ界面的项目就很受欢迎,当然我现在能写出远比那个好看的界面.但是我想一个应用最核心的东西不完全在界面,一个好的创意,一个好的后台服务才是成功的关键,这也是我不断学习的方向. 另外我发现在百度搜“悦词背单词91”搜索结果全是我在博客园的博文了...所以我把这个项目在91应用市场的下载地址粘上来吧,十分欢迎大家试用一下,有什么改进的意见请写在下面的评论里!地址:http://apk.91.c