有关Lucene的问题(2):stemming和lemmatization
问题:
我试验了一下文章中提到的 stemming 和 lemmatization
- 将单词缩减为词根形式,如“cars”到“car”等。这种操作称为:stemming。
- 将单词转变为词根形式,如“drove”到“drive”等。这种操作称为:lemmatization。
试验没有成功
代码如下:
public class TestNorms { |
不管是单复数,还是单词的变化,都是没有体现的
不知道是不是分词器的原因?
回答:
的确是分词器的问题,StandardAnalyzer并不能进行stemming和lemmatization,因而不能够区分单复数和词型。
文章中讲述的是全文检索的基本原理,理解了他,有利于更好的理解Lucene,但不代表Lucene是完全按照此基本流程进行的。
(1) 有关stemming
作为stemming,一个著名的算法是The Porter Stemming Algorithm,其主页为http://tartarus.org/~martin/PorterStemmer/,也可查看其论文http://tartarus.org/~martin/PorterStemmer/def.txt。
通过以下网页可以进行简单的测试:Porter's Stemming Algorithm Online[http://facweb.cs.depaul.edu/mobasher/classes/csc575/porter.html]
cars –> car
driving –> drive
tokenization –> token
然而
drove –> drove
可见stemming是通过规则缩减为词根的,而不能识别词型的变化。
在最新的Lucene 3.0中,已经有了PorterStemFilter这个类来实现上述算法,只可惜没有Analyzer向匹配,不过不要紧,我们可以简单实现:
public class PorterStemAnalyzer extends Analyzer |
把此分词器用在你的程序中,就能够识别单复数和规则的词型变化了。
public void createIndex() throws IOException { Field field = new Field("desc", "", Field.Store.YES, Field.Index.ANALYZED); writer.addDocument(doc); public void search() throws IOException { |
(2) 有关lemmatization
至于lemmatization,一般是有字典的,方能够由"drove"对应到"drive".
在网上搜了一下,找到European languages lemmatizer[http://lemmatizer.org/],只不过是在linux下面C++开发的,有兴趣可以试验一下。
首先按照网站的说明下载,编译,安装:
libMAFSA is the core of the lemmatizer. All other libraries depend on it. Download the last version from the following page, unpack it and compile: # tar xzf libMAFSA-0.2.tar.gz # cd libMAFSA-0.2/ # cmake . # make # sudo make install After this you should install libturglem. You can download it at the same place. # tar xzf libturglem-0.2.tar.gz # cd libturglem-0.2 # cmake . # make # sudo make install Next you should install english dictionaries with some additional features to work with. # tar xzf turglem-english-0.2.tar.gz # cd turglem-english-0.2 # cmake . # make # sudo make install |
安装完毕后:
- /usr/local/include/turglem是头文件,用于编译自己编写的代码
- /usr/local/share/turglem/english是字典文件,其中lemmas.xml中我们可以看到"drove"和"drive"的对应,"was"和"be"的对应。
- /usr/local/lib中的libMAFSA.a libturglem.a libturglem-english.a libtxml.a是用于生成应用程序的静态库
<l id="DRIVE" p="6" /> <l id="DROVE" p="6" /> <l id="DRIVING" p="6" /> |
在turglem-english-0.2目录下有例子测试程序test_utf8.cpp
#include <stdio.h> int main(int argc, char **argv) tl::lemmatizer lem; if(argc != 4) lem.load_lemmatizer(argv[1], argv[3], argv[2]); while (!feof(stdin)) if (in_s_buf[0]) return 0; |
编译此文件,并且链接静态库:注意链接顺序,否则可能出错。
g++ -g -o output test_utf8.cpp -L/usr/local/lib/ -lturglem-english -lturglem -lMAFSA –ltxml |
运行编译好的程序:
./output /usr/local/share/turglem/english/dict_english.auto /usr/local/share/turglem/english/prediction_english.auto /usr/local/share/turglem/english/paradigms_english.bin |
做测试,虽然对其机制尚不甚了解,但是可以看到lemmatization的作用:
drove was |
转载于:https://www.cnblogs.com/forfuture1978/archive/2010/02/06/1664915.html
有关Lucene的问题(2):stemming和lemmatization相关推荐
- NLP Stemming与Lemmatization的区别
Stemming:基于规则 from nltk.stem.porter import PorterStemmer porter_stemmer = PorterStemmer() porter_ste ...
- Lucene 4.X 全套教程
http://www.cnblogs.com/forfuture1978/category/300665.html Lucene 4.X 倒排索引原理与实现: (3) Term Dictionary和 ...
- Lucene原理与代码分析(高手博客备忘)
2019独角兽企业重金招聘Python工程师标准>>> 随笔 - 69 文章 - 77 评论 - 687 随笔分类 - Lucene原理与代码分析 Lucene 4.X 倒排索引 ...
- 全文检索框架Lucene——原理
一.总论 根据 http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库. 所以在了解Lucene之前 ...
- lucene原理及java实现
转自:http://blog.csdn.net/liuhaiabc/article/details/52346493 一.Lucene是什么? Lucene 是一个高效的,基于Java 的全文检索库. ...
- Solr or Lucene全文检索实现原理
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引:也可以通过Http Get操 ...
- 分布式搜索 Lucene全文检索基本原理
一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: Lucene 是一个高效的,基于Java 的全文检索库. 所以在了解Lucene之前要 ...
- Lucene 原理与代码分析完整版
原文地址为: Lucene 原理与代码分析完整版 Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新. 完整版pdf可由以下链接下载. Lucene 原理与代码分析完整版 ...
- lucene原理及java实现【容易理解】
转自 https://blog.csdn.net/m0_37955444/article/details/79514811 一.Lucene是什么? Lucene 是一个高效的,基于Java 的全文检 ...
最新文章
- python 程序打包成 exe 文件
- 如何从文件内容创建Java字符串?
- MySQL中的重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)的简单总结...
- 大部分公司并不需要微服务
- Spring MVC使用webSocket保持长连接
- 微前端之qiankun
- 被绞杀的网景:互联网门口第一滴血,互联网营销
- Visual C++ 6.0静态、动态链接库
- python Asyncore.dispatcher 理解
- 2004-2020年数学建模美赛O奖论文合集(免费)
- 你值得拥有的Mac PS滤镜插件和特效处理软件合集,不要错过!
- php面包屑导航实现思路,简单实现面包屑导航代码
- LIME-AI可解释模型:《“Why Should I Trust You?” Explaining the Predictions of Any Classifier》论文笔记
- matlab 判断矩阵是否正定
- PAT 1072 开学寄语
- 自己搭建云存储(WIFI路由器上接硬盘)
- html中url英文全称,URL的英文全称
- java的高内聚和低耦合_彻底弄懂高内聚与低耦合
- 从右下角出来的广告实例
- javascript使用插件