三沣开发知识 购物 网址 游戏 小说 歌词 地图 快照 开发 股票 美女 新闻 笑话 | 汉字 软件 日历 阅读 下载 图书馆 编程 租车 短信 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题
autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml
html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
  IT知识库 -> ASP.NET -> 【转】jieba.NET与Lucene.Net的集成 -> 正文阅读
 

[ASP.NET]【转】jieba.NET与Lucene.Net的集成

【转】jieba.NET与Lucene.Net的集成 首先声明:我对Lucene.Net并不熟悉,但搜索确实是分词的一个重要应用,所以这里还是尝试将两者集成起来,也许对你有一参考。
看到了两个中文分词与Lucene.Net的集成项目:Lucene.Net.Analysis.PanGu和Lucene.Net.Analysis.MMSeg,参考其中的代码实现了最简单的集成:jiebaForLuceneNet。下面给出简单的介绍。
1、JiebaTokenizer
主要的集成点是自定义一个Tokenizer的子类,此时必须要实现它的抽象方法IncrementToken,该方法用于对文本流中的文本生成的token进行遍历,这正是分词组件发挥作用的地方。


public override bool IncrementToken()
{
    ClearAttributes();
    position++;
    if (position < tokens.Count)
    {
        var token = tokens[position];
        termAtt.SetTermBuffer(token.Word);
        offsetAtt.SetOffset(token.StartIndex, token.EndIndex);
        typeAtt.Type = "Jieba";
        return true;
    }

    End();
    return false;
}


termAtt和offsetAtt所在的两行代码需要用到每一个token的词本身、起始索引和终止索引,而这三个值恰好是JiebaSegmenter.Tokenize方法所实现的,所以只要在初始化JiebaTokenizer时使用:

tokens = segmenter.Tokenize(text, TokenizerMode.Search).ToList();

就可以得到所有分词所得的token,另外TokenizerMode.Search参数使得Tokenize方法的结果中包含更全面的分词结果,比如“语言学家”会得到四个token,即“[语言, (0, 2)], [学家, (2, 4)], [语言学, (0, 3)], [语言学家, (0, 4)]”,这在创建索引和搜索时都很有帮助。
2、JiebaAnalyzer
Tokenizer类实现分词,而添加索引和搜索需要的是Analyzer,JiebaAnalyzer只要调用JiebaTokenizer即可。


public override TokenStream TokenStream(string fieldName, TextReader reader)
{
    var seg = new JiebaSegmenter();
    TokenStream result = new JiebaTokenizer(seg, reader);
    // This filter is necessary, because the parser converts the queries to lower case.
    result = new LowerCaseFilter(result);
    result = new StopFilter(true, result, StopWords);
    return result;
}


除了JiebaTokenizer,JiebaAnalyzer还会用到LowerCaseFilter和StopFilter。前者可将索引和搜索的内容正则化,忽略大小写,后者则过滤掉停用词。这里使用的停用词列表合并了NLTK的英文停用词和哈工大的中文停用词。
3、创建索引和搜索
创建索引时,IndexWriter要使用JiebaAnalyzer的实例:


var analyzer = new JiebaAnalyzer();

using (var writer = new IndexWriter(Directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED))
{
    // replaces older entry if any
    foreach (var sd in data)
    {
        AddToLuceneIndex(sd, writer);
    }

    analyzer.Close();
}


搜索的时候,先将用户的输入分词:


private static string GetKeyWordsSplitBySpace(string keywords, JiebaTokenizer tokenizer)
{
    var result = new StringBuilder();

    var words = tokenizer.Tokenize(keywords);

    foreach (var word in words)
    {
        if (string.IsNullOrWhiteSpace(word.Word))
        {
            continue;
        }

        result.AppendFormat("{0} ", word.Word);
    }

    return result.ToString().Trim();
}


比如如果用户输入的是“语言学家”,那么该函数的返回值是“语言 学家 语言学 语言学家”,为后面的搜索做好准备(另外,我们还可以为每个词加上一个*,这样只要部分匹配就可以搜到结果)。最后的搜索实现是:


private static IEnumerable<News> SearchQuery(string searchQuery, string searchField = "")
{
    if (string.IsNullOrEmpty(searchQuery.Replace("*", "").Replace("?", "")))
    {
        return new List<News>();
    }

    using (var searcher = new IndexSearcher(Directory, false))
    {
        var hitsLimit = 1000;
        //var analyzer = new StandardAnalyzer(Version.LUCENE_30);
        var analyzer = GetAnalyzer();

        if (!string.IsNullOrEmpty(searchField))
        {
            var parser = new QueryParser(Version.LUCENE_30, searchField, analyzer);
            var query = ParseQuery(searchQuery, parser);
            var hits = searcher.Search(query, hitsLimit).ScoreDocs;
            var results = MapLuceneToDataList(hits, searcher);

            analyzer.Dispose();
            return results;
        }
        else
        {
            var parser = new MultiFieldQueryParser(Version.LUCENE_30, new[] { "Id", "Title", "Content" }, analyzer);
            var query = ParseQuery(searchQuery, parser);
            var hits = searcher.Search(query, null, hitsLimit, Sort.RELEVANCE).ScoreDocs;
            var results = MapLuceneToDataList(hits, searcher);

            analyzer.Close();
            return results;
        }
    }
}


这里的searchField参数可以指定特定字段进行搜索,如果为空,则对所有字段进行搜索。至此实现了最基本的集成。
JiebaTokenizer、JiebaAnalyzer的实现和示例代码都可在jiebaForLuceneNet找到。
4、Luke.Net
Luke.Net可以查看Lucene.Net生成的索引内容,这在开发和调试Lucene的时候会特别有帮助。
参考:
Lucene.Net ultra fast search for MVC or WebForms site
Lucene.Net – Custom Synonym Analyzer
https://github.com/JimLiu/Lucene.Net.Analysis.PanGu
http://pangusegment.codeplex.com/wikipage?title=PanGu4Lucene
http://luke.codeplex.com/releases/view/82033
  ASP.NET 最新文章
IIS服务器的请求流程
通过Web Service实现IP地址查询功能
VS 远程调试阿里云上的web站点,Remote Deb
sqlserver的四种分页方式
WebService服务(转)
C#去除字符串中的反斜杠
asp.net微信开发第三篇
Linq详细介绍
2016 .net 招聘
ASP.NET程序从IIS6移植到IIS7时出现500.22错
上一篇文章      下一篇文章      查看所有文章
加:2017-10-20 23:21:33  更:2017-10-20 23:21:38 
 
技术频道: 站长资讯 .NET新手区 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA Visual Studio ASP.NET MVC .NET控件开发 Entity Framework WinRT/Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动设计 Html/Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP Oracle ERP Dynamics CRM K2 BPM 信息安全 企业信息化其他 Android开发 iOS开发 Windows Phone Windows Mobile 其他手机开发 敏捷开发 项目与团队管理 软件工程其他 SQL Server Oracle MySQL NoSQL 其它数据库 Windows 7 Windows Server Linux
脚本语言: vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程
网站开发: CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流 开发者乐园 Android开发资料
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-16 19:27:04
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT知识库