zoukankan      html  css  js  c++  java
  • Lucene.Net:使用eaglet的盘古分词进行分词和搜索(转载)

    本文主要简单介绍如何使用eaglet的盘古分词在lucene.net中进行创建索引和简单搜索。盘古分词是eaglet大大的杰作,如果您还没有尝试使用过,希望本文的介绍会对您有所帮助。

    1、盘古分词参考资料汇总

    http://www.cnblogs.com/eaglet/tag/%e5%88%86%e8%af%8d/

    http://pangusegment.codeplex.com/

    http://hubbledotnet.51aspx.com/

    http://home.cnblogs.com/group/topic/31349-6.html

    牛人的贡献不仅仅是无私提供几个工具,几个类库,几个开源项目,还有他们的博学,对知识理解的深度,以及谦虚低调的态度。大牛的人格魅力往往都是很吸引人的。向eaglet致敬。

    2、使用盘古分词器(PanGuAnalyzer)准备工作

    (1)、PanGu.xml文件

    这个文件主要保存盘古分词的常用配置,其中DictionaryPath 指明字典所在目录,可以为相对路径也可以为绝对路径;MatchOptions 对应分词选项;Parameters 对于分词参数。本文示例demo中,我选择的是默认配置。同时在该xml文件的属性上,把它的生成操作设置成“嵌入的资源”。

    (2)、如你所知,分词词库的维护也是盘古分词的一大重要工作。本文QueryApp控制台应用程序的bin目录下的Dictionaries是从codeplex上下载下来的(默认放在应用程序bin目录下)。这和(1)中的PanGu.xml的DictionaryPath 配置节点有关。

    (3)、应用程序中(本文即QueryApp控制台应用程序)必须同时引用Lucene.Net.dll,PanGu.dll和PanGu.Lucene.Analyzer.dll。

    3、创建索引

    Lucene.Net的IndexWriter在实例化的时候,需要一个Analyzer实例,使用盘古分词进行索引创建很简单,只要将PanGuAnalyzer实例传入IndexWriter构造函数,按步就班构造索引即可:

    01public static void PrepareIndex(bool isPangu)
    02{
    03    Analyzer analyzer = null;
    04    if (isPangu)
    05    {
    06        analyzer = new PanGuAnalyzer();//盘古Analyzer
    07    }
    08    else
    09    {
    10        analyzer = new StandardAnalyzer(Version.LUCENE_29);
    11    }
    12    DirectoryInfo dirInfo = Directory.CreateDirectory(Config.INDEX_STORE_PATH);
    13    LuceneIO.Directory directory = LuceneIO.FSDirectory.Open(dirInfo);
    14    IndexWriter writer = new IndexWriter(directory, analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
    15    CreateIndex(writer, "jeffreyzhao", "博客园有一个老赵,人格魅力巨大,洋名就叫jeffreyzhao。据我所知,他还是一个胖子,一个钢琴业余爱好者。");
    16    CreateIndex(writer, "lucene测试", "这是一个测试,关于lucene.net的 关注老赵");
    17    CreateIndex(writer, "博客园里有牛人", "Hello World. 我认识的一个高手,他拥有广博的知识,有极客的态度,还经常到园子里来看看");
    18    CreateIndex(writer, "奥巴马", "美国现任总统是奥巴马?确定不是奥巴牛和奥巴羊 不知道问老赵");
    19    CreateIndex(writer, "奥林匹克", "奥林匹克运动会将来到南美美丽热情的国度巴西,也就是亚马逊河流域的一个地方");
    20    CreateIndex(writer, "写给自己", "博客园的jeffwong,新的开始,继续努力了");
    21    writer.Optimize();
    22    writer.Close();
    23}

    4、简单搜索

    搜索同样也比较容易上手,只要将QueryParser中的Analyzer参数使用PanGuAnalyzer实例就可以了:

    1public static void PanguQueryTest(Analyzer analyzer, string field, string keyword)
    2{
    3    QueryParser parser = new QueryParser(Version.LUCENE_29, field, analyzer);
    4    string panguQueryword = GetKeyWordsSplitBySpace(keyword, new PanGuTokenizer());//对关键字进行分词处理
    5    Query query = parser.Parse(panguQueryword);
    6    ShowQueryExpression(analyzer, query, keyword);
    7    SearchToShow(query);
    8    Console.WriteLine();
    9}

    其中对关键字进行盘古分词处理的函数GetKeyWordsSplitBySpace直接来源于eaglet提供的示例代码:

    01public static string GetKeyWordsSplitBySpace(string keywords, PanGuTokenizer ktTokenizer)
    02{
    03    StringBuilder result = new StringBuilder();
    04    ICollection<WordInfo> words = ktTokenizer.SegmentToWordInfos(keywords);
    05    foreach (WordInfo word in words)
    06    {
    07        if (word == null)
    08        {
    09            continue;
    10        }
    11        result.AppendFormat("{0}^{1}.0 ", word.Word, (int)Math.Pow(3, word.Rank));
    12    }
    13    return result.ToString().Trim();
    14}

    PanGuTokenizer的SegmentToWordInfos这个方法,我正在查看源码实现,希望可以理解的更透彻一点。

    最后,本文面向的对象是初学者,如果您有好的使用经验和建议敬请不吝赐教。

    demo下载:LuceneNetApp

  • 相关阅读:
    20200209 ZooKeeper 3. Zookeeper内部原理
    20200209 ZooKeeper 2. Zookeeper本地模式安装
    20200209 Zookeeper 1. Zookeeper入门
    20200206 尚硅谷Docker【归档】
    20200206 Docker 8. 本地镜像发布到阿里云
    20200206 Docker 7. Docker常用安装
    20200206 Docker 6. DockerFile解析
    20200206 Docker 5. Docker容器数据卷
    20200206 Docker 4. Docker 镜像
    Combining STDP and Reward-Modulated STDP in Deep Convolutional Spiking Neural Networks for Digit Recognition
  • 原文地址:https://www.cnblogs.com/chenying99/p/1971386.html
Copyright © 2011-2022 走看看