盘古分词是一个基于 .net framework 的中英文分词组件。主要功能

中文未登录词识别
盘古分词可以对一些不在字典中的未登录词自动识别
词频优先
盘古分词可以根据词频来解决分词的歧义问题
多元分词
盘古分词提供多重输出解决分词粒度和分词精度权衡的问题
中文人名识别
输入: “张三说的确实在理”
分词结果:张三/说/的/确实/在理/
输入 “李三买了一张三角桌子”
分词结果:李三/买/了/一张/三角/桌子/
强制一元分词
输入 “张三说的确实在理”
分词结果: 张(,)/张三(,)/三说的(,)/三(,)/说(,)/的(,)/确(,)/确实(,)/实(,)/在 (,)/在理(,)/理(,)/
繁体中文分词
输入"我的選擇"
分词结果: 我/的/選擇/
同时输出简体和繁体
输入"我的選擇"
分词结果:我(,)/的(,)/选择(,)/選擇(,)/
中文词性输出
盘古分词可以将以登录词的中文词性输出给用户,以方便用户做进一步处理。
全角字符支持
盘古分词可以识别全角的字母和数字

在项目下新建Dict文件以及dll文件包含Lucene与盘古分词所需的组件及文件信息如图示

创建词库

        #region 将数据库关键字表的数据生成到分词关键字库

        /// <summary>
/// 将数据库关键字表的数据生成到分词关键字库
/// </summary>
public void CreateKeyWordLibrary()
{
try
{
m_Trace.Trace("CreateKeyWordLibrary m_IsRuning=" + m_IsRuning); if (m_IsRuning)
return; lock (m_lock)
{
m_IsRuning = true; var indexPath = AppDomain.CurrentDomain.BaseDirectory + @"\Config\lucenedir";
var directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());
//指定索引文件(打开索引目录) FS指的是就是FileSystem
var isUpdate = IndexReader.IndexExists(directory);
//IndexReader:对索引进行读取的类。该语句的作用:判断索引库文件夹是否存在以及索引特征文件是否存在。
if (isUpdate)
{
//同时只能有一段代码对索引库进行写操作。当使用IndexWriter打开directory时会自动对索引库文件上锁。
//如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁(提示一下:如果我现在正在写着已经加锁了,但是还没有写完,这时候又来一个请求,那么不就解锁了吗?这个问题后面会解决)
if (IndexWriter.IsLocked(directory))
IndexWriter.Unlock(directory);
}
var writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);
//向索引库中写索引。这时在这里加锁。 using (var bll = new WxOpenMsgManageBll())
{
listKeyWord = bll.QueryWxKeyWordManage();
} m_Trace.Trace("CreateKeyWordLibrary listKeyWord=" + listKeyWord.Count.ToString()); foreach (var keyword in listKeyWord)
{
var doc = new Document();
//Field.Store.YES:表示是否存储原值。只有当Field.Store.YES在后面才能用doc.Get("number")取出值来.Field.Index. NOT_ANALYZED:不进行分词保存
doc.Add(new Field("WxKeyWordManageId", keyword.WxKeyWordManageId.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("ResponseType", keyword.ResponseType.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
//Field.Index. ANALYZED:进行分词保存:也就是要进行全文的字段要设置分词 保存(因为要进行模糊查询)
//Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS:不仅保存分词还保存分词的距离。
doc.Add(new Field("KeyWord", keyword.KeyWord ?? "", Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
doc.Add(new Field("Contents", keyword.Contents ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("FilePath", keyword.FilePath ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("PicUrl", keyword.PicUrl ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.Add(new Field("Title", keyword.Title ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("Descriptions", keyword.Descriptions ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("MusicURL", keyword.MusicURL ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("HQMusicUrl", keyword.HQMusicUrl ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED)); doc.Add(new Field("Url", keyword.Url ?? "", Field.Store.YES, Field.Index.NOT_ANALYZED));
doc.Add(new Field("ArticleCount", keyword.ArticleCount.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED));
writer.AddDocument(doc); }
writer.Close();//会自动解锁。
directory.Close();//不要忘了Close,否则索引结果搜不到 m_IsRuning = false;
m_LastTime = DateTime.Now;
}
}
catch (Exception ex)
{
m_Trace.Trace("CreateKeyWordLibrary Exception=" + ex);
m_IsRuning = false;
}
} #endregion

搜索关键字

#region 搜索关键字响应信息

        /// <summary>
/// 搜索关键字响应信息
/// </summary>
/// <param name="messager"></param>
/// <returns></returns>
public string SearchKeyWord(WxMessager messager)
{
if (string.IsNullOrWhiteSpace(messager.Content))
return ""; try
{
var indexPath = AppDomain.CurrentDomain.BaseDirectory + @"\Config\lucenedir";
var list = PanGuSplitWord(messager.Content);//对用户输入的搜索条件进行拆分。
var directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NoLockFactory());
var reader = IndexReader.Open(directory, true);
var searcher = new IndexSearcher(reader); var parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "KeyWord", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
var booleanQuery = new BooleanQuery();
foreach (string word in list)//先用空格,让用户去分词,空格分隔的就是词“计算机 专业”
{
var query1 = new TermQuery(new Term("KeyWord", word));
booleanQuery.Add(query1, Lucene.Net.Search.BooleanClause.Occur.SHOULD);
}
var collector = TopScoreDocCollector.create(, true);
searcher.Search(booleanQuery, null, collector);
var docs = collector.TopDocs(, collector.GetTotalHits()).scoreDocs;
//得到所有查询结果中的文档,GetTotalHits():表示总条数 TopDocs(300, 20);//表示得到300(从300开始),到320(结束)的文档内容.
//可以用来实现分页功能 var viewModelList = new List<WxKeyWordManage>();
for (int i = ; i < docs.Length; i++)
{
var keyWordManage = new WxKeyWordManage();
int docId = docs[i].doc;//得到查询结果文档的id(Lucene内部分配的id)
var doc = searcher.Doc(docId);//找到文档id对应的文档详细信息
keyWordManage.ArticleCount = Convert.ToInt32(doc.Get("ArticleCount"));
keyWordManage.Contents = doc.Get("Contents");
keyWordManage.Descriptions = doc.Get("Descriptions");
keyWordManage.FilePath = doc.Get("FilePath");
keyWordManage.HQMusicUrl = doc.Get("HQMusicUrl");
keyWordManage.KeyWord = doc.Get("KeyWord");
keyWordManage.MusicURL = doc.Get("MusicURL");
keyWordManage.PicUrl = doc.Get("PicUrl");
keyWordManage.ResponseType = Convert.ToInt32(doc.Get("ResponseType"));
keyWordManage.Title = doc.Get("Title");
keyWordManage.Url = doc.Get("Url");
viewModelList.Add(keyWordManage);
} if (viewModelList != null && viewModelList.Count > )
{
//获取到相应的数据--响应给用户
var first = viewModelList.FirstOrDefault();//根据搜索规则第一条为最佳匹配项
//0-文本1-图片2-语音3-视频4-音乐5-图文
var resp_type = first.ResponseType; switch (resp_type)
{
case ://文本信息
return messager.ToTextMessageXml(first.Contents.Replace("@@H5Domain@@", AirwayKeeperModel.KTGJDomainName));
case ://图片
string picUrl = first.PicUrl;
var image = WxUpLoad(picUrl);
if (!string.IsNullOrWhiteSpace(image.media_id))
return messager.ToImageMessageXml(image.media_id);
break;
case ://语音
break;
case ://视频
break;
case ://音乐
break;
case ://图文
break;
default:
break;
}
}
}
catch (Exception ex)
{
m_Trace.Trace("SearchKeyWord Exception=" + ex);
} return "";
} #endregion

根据搜索结果处理相关业务即可

例如

公众号消息:查一下我的积分呗?

回复内容:<a href='http://h5.ktgj.com/h5/WMyPoints'>点我查看</a>我的积分

引导用户跳转H5网页查询相关业务数据

网盘资料

http://pan.baidu.com/s/1hs5Lahm

【盘古分词】Lucene.Net 盘古分词 实现公众号智能自动回复的更多相关文章

  1. node微信公众号开发---自动回复

    微信开发的特点:1.post请求 (一定要注意,这里和配置域名的时候不一样,配置域名是get请求)2.数据包是xml格式的3.你给微信返回的数据也是xml格式的 var parseString = r ...

  2. Django实现微信公众号简单自动回复

    在上篇博客阿里云部署django实现公网访问已经实现了了django在阿里云上的部署,接下来记录django实现微信公众号简单回复的开发过程,以方便日后查看 内容概要: (1)微信公众号声请 (2)微 ...

  3. .net公众号开发自动回复消息

    using System;using System.Collections.Generic;using System.Web;using System.Web.UI;using System.Web. ...

  4. springboot+lucene实现公众号关键词回复智能问答

    一.场景简介 最近在做公众号关键词回复方面的智能问答相关功能,发现用户输入提问内容和我们运营配置的关键词匹配回复率极低,原因是我们采用的是数据库的Like匹配. 这种模糊匹配首先不是很智能,而且也没有 ...

  5. 小机器人自动回复(python,可扩展开发微信公众号的小机器人)

    api来之图灵机器人.我们都知道微信公众号可以有自动回复,我们先用python脚本编写一个简单的自动回复的脚本,利用图灵机器人的api. http://www.tuling123.com/help/h ...

  6. 微信小程序内判断是否关注公众号(JAVA)

    微信小程序内判断是否关注公众号(JAVA) 思路来源(第二种): https://blog.csdn.net/Yanheeee/article/details/117295643 /** * 总体思路 ...

  7. 【原创】Lucene.Net+盘古分词器(详细介绍)

    本章阅读概要 1.Lucenne.Net简介 2.介绍盘古分词器 3.Lucene.Net实例分析 4.结束语(Demo下载) Lucene.Net简介 Lucene.net是Lucene的.net移 ...

  8. Lucene.Net+盘古分词器(详细介绍)(转)

    出处:http://www.cnblogs.com/magicchaiy/archive/2013/06/07/LuceneNet%E7%9B%98%E5%8F%A4%E5%88%86%E8%AF%8 ...

  9. 使用Lucene.net+盘古分词实现搜索查询

    这里我的的Demo的逻辑是这样的:首先我基本的数据是储存在Sql数据库中,然后我把我的必需的数据推送到MongoDB中,这样再去利用Lucene.net+盘古创建索引:其中为什么要这样把数据推送到Mo ...

随机推荐

  1. Linux-HA实战(3)— 基于Pacemaker搭建TFS Nameserver HA

    上篇文章简单介绍了下基于Heartbeat的虚拟IP配置,个人觉得简单易用已经能够应付大部分场景了.但是既然花时间研究HA,如果仅限于一个虚拟IP飘来飘去未免有点糊弄任务了,因此这篇文章打算介绍下基于 ...

  2. Java如何获取正在运行的线程的名称?

    在Java编程中,如何获取正在运行的线程的名称? 以下示例显示如何获取正在运行的线程的名称. package com.yiibai; public class GettingThreadName ex ...

  3. 嵌入式驱动开发之内核态spi ---module_spi_driver

    http://blog.csdn.net/dearsq/article/details/51839083 http://blog.csdn.net/alleincao/article/details/ ...

  4. Cisco交换机配置VLAN

    Cisco IOS中有两种方式创建vlan,在全局模式下使用vlan vlanid命令,如switch(config)#vlan 10; 在vlan database 下创建vlan ,如 switc ...

  5. MVC4小细节

    一: @model 指令 或者也叫  @model关键字   注释:@model指令以提供一个更干净简洁的方式来指明你想要在视图文件中引用强类型模型类 作用:让视图文件(cshtml)更易读易写;VS ...

  6. WAS集群:记一次Node Agent不活动问题解决过程

    之前很少接触集群,准确地说是很少接触项目现场的实施工作,或者说接触到的都是比较简单的实施工作,安装Linux.WAS.Oracle相对来说都比较简单.一直埋头干着研发的活,干着不要紧,一干就是好几年. ...

  7. js 事件调度

    var EventTarget = function () { this._listener = {}; }; EventTarget.prototype = { constructor: this, ...

  8. 没有公网的IP的用户有福了,即使您没有公网IP,我们要一样可以让您与ER对接,同时可远程访问

    EasyRadius从7.10起,开始向使用者平摊使用费用,即服务器托管费用.维护费用,向用户征收少量费用.即300元/年/1000用户,600元/年/无限制用户. 按比较高的费用1000用户计费,即 ...

  9. 树莓派命令行配置连接wifi

    iwlist scan sudovim /etc/wpa_supplicant/wpa_supplicant.conf   network={   ssid="WIFINAME" ...

  10. Mybatis最入门---数据库的下载与安装

    [一步是咫尺,一步即天涯] 近期.因为工作进度调整,之前的Spring教程就先临时告一段落了,兴许找个时间继续更新,假设有那位看官想了解某个内容的,敬请留言,大家一起学习. 作为数据库工具的使用开篇. ...