盘古分词平台兼容性

在使用Lucece.net,需要一个中文的分词组件,比较好的是盘古分词,但是我希望能够在mono的环境下运行,就使用moma检查了一下盘古分词

Assembly Version Missing Not Implemented Todo P/Invoke

PanGu.dll 2.3.1.0 3 0 5 0

Calling Method Method Missing from Mono

WordInfo> PreSegment (string) string Strings.StrConv (string, VbStrConv, int)

WordInfo> PreSegment (string) string Strings.StrConv (string, VbStrConv, int)

WordInfo> PreSegment (string) string Strings.StrConv (string, VbStrConv, int)

Calling Method Method with [MonoTodo] Reason

string ReadFileToString (string, Encoding) int Marshal.GetHRForException (Exception) SetErrorInfo

MemoryStream ReadFileToStream (string) int Marshal.GetHRForException (Exception) SetErrorInfo

void WriteStream (string, MemoryStream) int Marshal.GetHRForException (Exception) SetErrorInfo

void WriteLine (string, string) int Marshal.GetHRForException (Exception) SetErrorInfo

void WriteString (string, string, Encoding) int Marshal.GetHRForException (Exception) SetErrorInfo

  1. 是StrConv这个函数没有检查通过,发现作者使用了 Microsoft.VisualBasic.Strings.StrConv 这个类库来处理简体和繁体转换的问题,这个类用到了windows平台的特性,所以没有编译通过,于是写了个简单的简体繁体转换的类库:简体中文与繁体相互转换.

  2. 是一个Marshal.GetHRForException 用来做io处理出错的时候判断的,代码如下大概是出现了ERR_PROCESS_CANNOT_ACCESS_FILE错误时让线程稍等。代码如下

    uint hResult = (uint)System.Runtime.InteropServices.Marshal.GetHRForException(e);

    if (hResult == ERR_PROCESS_CANNOT_ACCESS_FILE)

    {

    if (times > 10)

    {

    //Maybe another program has some trouble with file

    //We must exit now

    throw e;

    }

     System.Threading.Thread.Sleep(200);
    times++;

    }

    else

    {

    throw e;

    }

查找MSDN在Marshal,如何:映射 HRESULT 和异常 里面有一句话 :

COM 方法通过返回 HRESULT 来报告错误;.NET 方法则通过引发异常来报告错误。 运行时将处理这两者之间的转换。 .NET Framework 中的每个异常类都会映射到一个 HRESULT。

也就是说HRESULT是给com来报告错误的,.net本身通过引发异常来处理错误,而这个IOException对应出来的hresult是

文件“xxxx”正由另一进程使用,因此该进程无法访问此文件。

但是引起这个错误的异常根源就是IOException,内部有个私有的HResult无法访问。只能修改为所有的错都等待10次,10次之后抛出异常,所以把外面的if之外的代码都注释掉变成

if (times > 10)
{
//Maybe another program has some trouble with file
//We must exit now
throw e;
} System.Threading.Thread.Sleep(200);
times++;

这样两个不兼容的问题就解决了。

盘古分词Lucene3.03支持

现在盘古分词给出的Lucene的示例是2.x的版本,而我希望能够用3.0的版本来集成,其中的区别是PanGuTokenizer.cs里面集成的时候会提示Next()方法没有找到合适的类来重写。原因是lucene中next()方法已改成incrementToken()方法.lucene的文档:

This method is called for every token of a document, so an efficient implementation is crucial for good performance. To avoid calls to AttributeSource.addAttribute(Class) and AttributeSource.getAttribute(Class), references to all AttributeImpls that this stream uses should be retrieved during instantiation.

所以只需要修改这个方法,改为使用addAttribute来实现:

这里有一个已经修改好了的pangu分词的版本https://github.com/JimLiu/Lucene.Net.Analysis.PanGu .主要代码如下,其中next还是原来的方法,去掉override.

添加属性

private ITermAttribute termAtt;
private IOffsetAttribute offsetAtt;
private IPositionIncrementAttribute posIncrAtt;
private ITypeAttribute typeAtt; termAtt = AddAttribute<ITermAttribute>();
offsetAtt = AddAttribute<IOffsetAttribute>();
posIncrAtt = AddAttribute<IPositionIncrementAttribute>();
typeAtt = AddAttribute<ITypeAttribute>();

方法实现

public override bool IncrementToken()
{
ClearAttributes();
Token word = Next();
if (word != null)
{
termAtt.SetTermBuffer(word.Term);
offsetAtt.SetOffset(word.StartOffset, word.EndOffset);
typeAtt.Type = word.Type;
return true;
}
End();
return false;
}

以上就是让lucene.net在mono下使用盘古分词出现的一些问题。

盘古分词修改支持mono和lucene.net3.03的更多相关文章

  1. lucene.net helper类 【结合盘古分词进行搜索的小例子(分页功能)】

      转自:http://blog.csdn.net/pukuimin1226/article/details/17558247 添加:2013-12-25 更新:2013-12-26 新增分页功能. ...

  2. lucene.net 3.0.3、结合盘古分词进行搜索的小例子(转)

    lucene.net 3.0.3.结合盘古分词进行搜索的小例子(分页功能)   添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新:2013-12-27 新增按分类查询功能, ...

  3. lucene.net 3.0.3、结合盘古分词进行搜索的小例子(分页功能)

    转自:http://blog.csdn.net/pukuimin1226/article/details/17558247 添加:2013-12-25 更新:2013-12-26 新增分页功能. 更新 ...

  4. Lucene.Net+盘古分词->开发自己的搜索引擎

    //封装类 using System;using System.Collections.Generic;using System.Linq;using System.Web;using Lucene. ...

  5. 让盘古分词支持最新的Lucene.Net 3.0.3

    原文:让盘古分词支持最新的Lucene.Net 3.0.3 好多年没升级过的Lucene.Net最近居然升级了,到了3.0.3后接口发生了很大变化,原来好多分词库都不能用了,所以上次我把MMSeg给修 ...

  6. 支持Mono的盘古分词(PanGu)

    不废话,直接上下载地址http://files.cnblogs.com/files/RainbowInTheSky/PanGu.rar 群友在做项目移植到Mono+jexus上时遇到了问题,盘古分词无 ...

  7. Lucene.Net3.0.3+盘古分词器学习使用

    一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...

  8. Lucene.Net+盘古分词

    前言 各位朋友,谢谢大家的支持,由于文件过大,有考虑到版权的问题,故没有提供下载,本人已建立一个搜索技术交流群:77570783,源代码已上传至群共享,需要的朋友,请自行下载! 首先自问自答几个问题, ...

  9. lucene+盘古分词

    一般的网站都会有都会有搜索的功能,一般实现搜索主要有三种方案 第一种是最差的,也是最不推荐的,使用数据库的模糊查询例如select * form table where 字段 like XXX,这种查 ...

随机推荐

  1. ASP.NET程序也能像WinForm程序一样运行[转载]

    阅读目录 开始 操作方式 支持的ASP.NET程序类别 它也是个HTTP服务器 支持远程机器访问 不受限于Windows防火墙 尊重每个人的操作习惯 内置多标签浏览器支持 启动参数及配置文件 支持 . ...

  2. scala中Map和Set

    scala中Set包含可变set和不可变Set,set的子类HashSet,各有一个扩展了可变和不可变的set特质.  可变set import scala.collection.mutable.Se ...

  3. 怎么安装ABBYY FineReader

    ABBYY FineReader是市场领先的文字识别(OCR)软件,可快速方便地将扫描纸质文档.PDF文件和数码相机的图像转换成可编辑.可搜索信息,ABBYY FineReader 12是目前最新版本 ...

  4. Mapper method 'com.autoyol.mapper.trans.AccountLogMapper.getTotalIncomByMemNoLastest attempted to return null from a method with a primitive return type (int).解决方法

    1.打开日志输出,降低日志级别. <AppenderRef ref="console" level="trace"></AppenderRef ...

  5. python缓存装饰器,第二种方式(二)

    来个简单的装饰器 def cached_method_result(fun): """方法的结果缓存装饰器""" @wraps(fun) d ...

  6. [Module] 03 - Software Design and Architecture

    本篇涉及内容: ORM框架(无需再用contentprovider或者sqlitedatebasehelper之类的古董工具了) 规划各种业务Bean文件(配合ORM框架) 设计一个好的请求基类(Ba ...

  7. Struts2_day02讲义_使用Struts完成对客户的新增操作

  8. 利用OpenSSL库对Socket传输进行安全加密(RSA+AES)

    轉自:http://blog.chinaunix.net/uid-9543173-id-3921143.html 利用OpenSSL库对Socket传输进行安全加密(RSA+AES) 1. 利用RSA ...

  9. 启用sharepoin2013中的ChartWebPart

    首先看一张sharepoint2013中ChartWebPart的效果图. 在sharepoint2010中加入了一个新的webpart,叫ChartWebPart,提供了对数据的图表展示,可以对数据 ...

  10. Ansible Playbook 使用变量

    如何在 Playbook 中定义并使用变量: vars: - user: "test" # 定义变量 tasks: - name: create user user: name=& ...