测试分词工具Lucene.Net.Analysis.PanGu(盘古分词)

  从微信公众号及百度文章来看,全文检索的前置工作是分词,首先将要做全文检索的内容分词,然后采用全文检索模块或工具进行全文检索。参考文献4介绍了基于Lucene.net实现全文检索的大致思路,其采用的是Lucene.net+盘古分词的方式实现。参考文献5-6中介绍了近些年常用的.net的中文分词组件,准备从中选几个进行使用测试。本文就先以盘古分词为例测试及分词功能的基本用法。
  Lucene.Net.Analysis.PanGu是盘古分词的.netcore升级版(参考文献1,其实也有不少年头了,GitHub最后更新时间都是七年前了),由于老版本不支持最新Lucene.Net 3.0.3,对其进行了升级,可以支持最新的Lucene.Net 3.0.3。可以直接NuGet安装。另外把词库打包到dll文件里面了,无需拷贝词库。
新建项目,在NuGet包管理器中搜索并找到Lucene.Net.Analysis.PanGu包,可以看到NuGet服务器中与PanGu相关的包还是不少。

在这里插入图片描述
  Lucene.Net.Analysis.PanGu包中最重要的类是Lucene.Net.Analysis.PanGu命名空间中的PanGuAnalyzer类,该类用于根据输入的字符串或文本流返回分词集合,也即TokenStream对象。
在这里插入图片描述
  PanGuAnalyzer类既可以直接读取字符串进行分词,也可以读取本地文件分词(其实都是转成TextReader类的实例),下面是直接读取字符串分词的示例及结果(示例代码参考自参考文献2-3)。

	Analyzer analyzer = new PanGuAnalyzer();
    TokenStream tokenStream = analyzer.TokenStream("", new StringReader("白日依山尽,黄河入海流。欲穷千里目,更上一层楼。"));
    ITermAttribute ita = null;
    bool hasNext = tokenStream.IncrementToken();
    while (hasNext)
    {
        ita = tokenStream.GetAttribute<ITermAttribute>();
        txtResult.Text += ita.Term + "/";
        hasNext = tokenStream.IncrementToken();
    }

在这里插入图片描述

  然后是读取本地文件的,从网易新闻上找了一段话存到文本文件中,然后读取后分词,下面是示例及结果。

	txtResult.Text = String.Empty;

    using (TextReader tr = File.OpenText(txtPath.Text))
    {
        Analyzer analyzer = new PanGuAnalyzer();
        TokenStream tokenStream = analyzer.TokenStream("", tr);
        ITermAttribute ita = null;
        bool hasNext = tokenStream.IncrementToken();
        while (hasNext)
        {
            ita = tokenStream.GetAttribute<ITermAttribute>();
            txtResult.Text += ita.Term + "/";
            hasNext = tokenStream.IncrementToken();
        }
    }

在这里插入图片描述

  测试过程中发现的问题包括:1)文本文件的编码格式应为UTF-8或者Unicode,ANSI格式的文本文件读出来分词时是乱码;2)文本文件内容多了的话会卡死(试了几M及几十K的文本文件),可能是程序太简单,很多设置没有配置的原因,后续准备再继续学习Lucene.Net.Analysis.PanGu的用法。

参考文献:
[1]https://github.com/JimLiu/Lucene.Net.Analysis.PanGu
[2]https://www.cnblogs.com/zhang1f/p/14330506.html
[3]https://blog.csdn.net/m0_37554403/article/details/105684181
[4]https://blog.csdn.net/sd7o95o/article/details/119121420
[5]https://www.jianshu.com/p/6f47b670fcb0
[6]https://blog.51cto.com/u_15834522/5766716

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Delphi 2010 中调用 Lucene.Net.dll 函数可以使用 .NET 桥接技术来实现。具体步骤如下: 1. 在 Delphi 中创建一个 .NET 桥接单元,用于连接 Lucene.Net.dll。可以使用 Delphi 的 .NET 桥接工具来自动生成这个单元。在 Delphi IDE 中,选择“File”->“New”->“.NET Assembly”,然后选择 Lucene.Net.dll 文件,生成一个 .NET 桥接单元。 2. 在 Delphi 2010 中创建一个新项目,并将刚才生成的 .NET 桥接单元添加到项目中。 3. 在 Delphi 中编写代码调用 Lucene.Net.dll 中的函数。可以使用 Delphi 的 .NET 桥接技术直接访问 Lucene.Net.dll 中的类型和方法。 以下是一个简单的示例代码,演示如何使用 Delphi 2010 调用 Lucene.Net.dll 中的函数: ```delphi unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses Lucene.Net.Store, Lucene.Net.Analysis.Standard, Lucene.Net.Documents, Lucene.Net.Index; {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); var dir: FSDirectory; analyzer: StandardAnalyzer; writer: IndexWriter; doc: Document; begin dir := TDirectory.GetDirectory('c:\index'); analyzer := TStandardAnalyzer.Create; writer := TIndexWriter.Create(dir, analyzer, True); doc := TDocument.Create; doc.Add(TField.Create('title', 'Delphi', TField.TERM_VECTOR_YES)); doc.Add(TField.Create('body', 'Lucene.Net.dll', TField.TERM_VECTOR_YES)); writer.AddDocument(doc); writer.Commit; writer.Close; analyzer.Close; dir.Close; Memo1.Lines.Add('Document added to index'); end; end. ``` 在这个示例中,我们使用 Delphi 2010 调用 Lucene.Net.dll 中的 IndexWriter 类来将一个文档添加到索引中。我们还使用 Lucene.Net.dll 中的 FSDirectory 和 StandardAnalyzer 类来创建索引目录和分析器。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值