英文分词的算法和原理

英文分词的算法和原理

根据文档相关性计算公式

分词质量对于基于词频的相关性计算是无比重要的

英文(西方语言)语言的基本单位就是单词,所以分词特别容易做,只需要3步:

  1. 根据空格/符号/段落 分隔,得到单词组
  2. 过滤,排除掉stop word
  3. 提取词干

第一步:按空格/符号分词

用正则表达式很容易

  1. pattern = r‘‘‘(?x)    # set flag to allow verbose regexps
  2.      ([A-Z]\.)+        # abbreviations, e.g. U.S.A.
  3.    | \w+(-\w+)*        # words with optional internal hyphens
  4.    | \$?\d+(\.\d+)?%?  # currency and percentages, e.g. $12.40, 82%
  5.    | \.\.\.            # ellipsis
  6.    | [][.,;"‘?():-_`]  # these are separate tokens
  7.    ‘‘‘
  8. re.findall(pattern,待分词文本)

第二步:排除stop word

stopword就是类似a/an/and/are/then 的这类高频词,高频词会对基于词频的算分公式产生极大的干扰,所以需要过滤

第三步:提取词干

词干提取(Stemming) 这是西方语言特有的处理,比如说英文单词有 单数复数的变形,-ing和-ed的变形,但是在计算相关性的时候,应该当做同一个单词。比如 apple和apples,doing和done是同一个词,提取词干的目的就是要合并这些变态

Stemming有3大主流算法

Lucene 英文分词自带了3个stemming算法,分别是

  1. EnglishMinimalStemmer
  2. 著名的 Porter Stemming
  3. KStemmer

词干提取算法并不复杂,要么是一堆规则,要么用映射表,编程容易,但是必须是这种语言的专家,了解构词法才行啊

http://text-processing.com/demo/stem/ 是一个在线试验词干提取算法的网站

Lemmatisation

Lemmatisation是和词干提取(Stemming) 齐名的一个语言学名词,中文可以叫做 词形还原 ,就是通过查询字典,把 "drove" 还原到 "drive"
而stemming会把单词变短,"apples","apple"处理之后都变成了 "appl"

做计算机语言学研究才会涉及到lemmatization,我个人觉得做搜索完全可以不考虑,Stemming已经可以解决大问题了

参考

搜索相关度算法公式: BM25

BM25算法的全称是 Okapi BM25,是一种二元独立模型的扩展,也可以用来做搜索的相关度排序。

Sphinx的默认相关性算法就是用的BM25。Lucene4.0之后也可以选择使用BM25算法(默认是TF-IDF)。如果你使用的solr,只需要修改schema.xml,加入下面这行就可以

<similarity class="solr.BM25Similarity"/>

BM25也是基于词频的算分公式,分词对它的算分结果也很重要

IDF公式

  • f(qi,D):就是词频
  • |D|:[给定文档]D长度。
  • avgdl:索引中所有文档长度。

抽象点看,BM25的公式其实和TF-IDF公式大同小异,可以也可以当做 = ∑ idf(q) * fx(tf),

只不过,BM25的idf和tf都做了一些变形,特别是tf公式,还加入了两个经验参数k1和b,K1和b用来调整精准度,一般情况下我们取K1=2,b=0.75

至于BM25和TF-IDF 哪种相关性算法更更好,我认为依赖于搜索质量评估标准

参考

Lucene TF-IDF 相关性算分公式

Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序

TF:词频,IDF:逆向文档频率,TF-IDF是一种统计方法,或者被称为向量空间模型,名字听起来很复杂,但是它其实只包含了两个简单规则

  1. 某个词或短语在一篇文章中出现的次数越多,越相关
  2. 整个文档集合中包含某个词的文档数量越少,这个词越重要

所以一个term的TF-IDF相关性等于 TF * IDF

这两个规则非常简单,这就是TF-IDF的核心规则,第二个的规则其实有缺陷的,他单纯地认为文本频率小的单词就越重要,文本频率大的单词就越无 用,显然这并不是完全正确的。并不能有效地反映单词的重要程度和特征词的分布情况,比如说搜索web文档的时候,处于HTML不同结构的特征词中对文章内 容的反映程度不同,应该有不同的权重

TF-IDF的优点是算法简单,运算速度很快

Lucene为了提高可编程行,在上述规则做了一些扩充,就是加入一些编程接口,对不同的查询做了权重归一化处理,但是核心公式还是TF * IDF

Lucene算法公式如下

score(q,d)   =   coord(q,d) ·  queryNorm(q) ·    ∑    ( tf(t in d) ·  idf(t)2 ·  t.getBoost() ·  norm(t,d) )

  • tf(t in d ),  = frequency?
  • idf(t)   = 1 +log(文档总数/(包含t的文档数+1))
  • coord(q,d) 评分因子,。越多的查询项在一个文档中,说明些文档的匹配程序越高,比如说,查询"A B C",那么同时包含A/B/C3个词的文档 是3分,只包含A/B的文档是2分,coord可以在query中关掉的
  • queryNorm(q)查询的标准查询,使不同查询之间可以比较
  • t.getBoost() 和 norm(t,d) 都是提供的可编程接口,可以调整 field/文档/query项 的权重

各种编程插口显得很麻烦,可以不使用,所以我们可以把Lucence的算分公式进行简化

score(q,d) = coord(q,d) ·      ∑    ( tf(t in d) ·  idf(t)2 )

结论

  1. TF-IDF 算法是以 term为基础的,term就是最小的分词单元,这说明分词算法对基于统计的ranking无比重要,如果你对中文用单字切分,那么就会损失所有的语义相关性,这个时候 搜索只是当做一种高效的全文匹配方法
  2. 按照规则1 某个词或短语在一篇文章中出现的次数越多,越相关 一定要去除掉stop word,因为这些词出现的频率太高了,也就是TF的值很大,会严重干扰算分结果
  3. TF和IDF在生成索引的时候,就会计算出来: TF会和DocID保存在一起(docIDs的一部分),而IDF= 总文档数 / 当前term拥有的docIDs 长度
时间: 2024-10-16 13:36:32

英文分词的算法和原理的相关文章

机器学习笔记_PRML_Adaboost 算法的原理与推导

转自:http://blog.csdn.net/v_july_v/article/details/40718799 Adaboost 算法的原理与推导 1 Adaboost的原理 1.1 Adaboost是什么 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出.它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器.同时,在每一轮中加

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果

本文完全转载:http://www.cnblogs.com/Imageshop/p/3281703.html,再次仅当学习交流使用.. <Single Image Haze Removal Using Dark Channel Prior>一文中图像去雾算法的原理.实现.效果(速度可实时) 本文算法合作联系QQ: 33184777, 非诚勿扰 邮件地址:   [email protected] 最新的效果见 :http://video.sina.com.cn/v/b/124538950-125

Adaboost 算法的原理与推导——转载及修改完善

<Adaboost算法的原理与推导>一文为他人所写,原文链接: http://blog.csdn.net/v_july_v/article/details/40718799 另外此文大部分是摘录李航的<统计学笔记>一书,原书下载链接:http://vdisk.weibo.com/s/z4UjMcqGpoNTw?from=page_100505_profile&wvr=6 在根据文中推导是发现有计算错误以及省略的步骤,在下文将会进行说明. ------------------

RSA算法之原理篇

序言 RSA算法是出现最早得到广泛应用的公钥加密算法.它在通信加密.签名认证等领域都起着重要作用. 历史 RSA算法最早由英国数学家Clifford Cocks在1973年发明,但由于当时被英国政府列为最高机密,直到死后不久其工作成果才被公布.而1977年,Ron Rivest.Adi Shamir 和 Leonard Adleman三人在MIT合作发表了一篇完整描述RSA算法的论文,被正式承认为该算法的发明者.RSA这个名字也正是由三人姓氏的首字母组成. 很有意思的一件事情是,RSA算法并不是

常见hash算法的原理(转)

常见hash算法的原理 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间.7

一个日期算法的原理分析

1.问题描述 在 OSC 问答频道有一个问题:时间算法:帮忙解答下 简单的复述一遍就是能够通过如下式子来计算month月day日是一年的第几天. 闰年是 day_of_year=(275*month)/9 - (month+9)/12 + day - 30 非闰年比这个少1天.可以简单的验证,这个式子中每个部分计算后都取整,整个结果总是对的. 我们知道1.3.5.7.8.10.12都是31天,2月的天数有点诡异,其他都是30天,正常情况下我们写程序会写很多if来判断月份,进而计算累积的天数.但是

理解RMQ问题和ST算法的原理

下图为TI C6xx DSP Nyquist总线拓扑图,总线连接了master与slave,提供了高速的数据传输.有很多种速率不同的总线,如图中的红色方框,最高速总线为CPU/2 TeraNet SCR(即VBUSM SCR),带宽为256bit,其他低速总线为CPU/3,CPU/6,带宽参考图中所示.总线之间用Bridge(桥)连接,作用包括转换总线的速率,使之与所流向总线的速率相同等. 在具体应用中,各种速率的总线完全可以满足复杂的数据传输,而数据传输的瓶颈往往在于连接总线之间的Bridge

中文分词常用算法之基于词典的正向最大匹配

算法描述: S1为带切分字符串,S2为空,MaxLen为词典中的最大词长 判断S1是否为空,若是则输出S2 从S1左边开始,取出待处理字符串str(其中str的长度小于MaxLen) 查看str是否在词典中,若是则转5,若否则转6 S2+=str+”/”,S1-=str,转2 将str最右边的一个字去掉 判断str是否为单字,若是则转5,若否则转4 Java实现代码: 1 public static List<String> FMM(String text) { 2 List<Strin

常见hash算法的原理

转自:http://blog.csdn.net/zxycode007/article/details/6999984 散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的