关于 C# 调用 ICTCLAS 逐句分词报异常的问题解决
来源:互联网 发布:智能电视和网络电视有什么区别 编辑:程序博客网 时间:2024/06/11 10:28
最近在用ICTCLAS2012进行逐句分词,由于代码使用C#编写,且需要逐句进行分词,所以选择调用ICTCLAS50为C#提供的调用接口直接进行分词。这里需要注意的是ICTCLAS50的C#调用接口与ICTCLAS2010的接口形式不同,虽然按照旧接口形式调用依然可以运行,但是一般在分词语句数量达到1300句时,会报异常“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”。
翻出ICTCLAS50的接口文档,发现新的接口形式描述为:
[DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "ICTCLAS_ParagraphProcess")] public static extern int ICTCLAS_ParagraphProcess(String sParagraph, int nPaLen,String sResult, eCodeType eCt, int bPOStagged);
但是直接调用一般会出现分词结果为空字符串的问题(若sResult字符串已赋初值为 ""(空字符串)的情况下),虽然旧的问题不再出现,但是分词目的无法达到。考虑到对于C/C++接口中sResult处为输出字符串,且ICTCLAS50.h头文件中提示过需要用户自行分配内存,所以考虑使用StringBuilder类型传值,即如下形式更改其分词接口:[DllImport(path, CharSet = CharSet.Ansi, EntryPoint = "ICTCLAS_ParagraphProcess")] public static extern int ICTCLAS_ParagraphProcess(String sParagraph, int nPaLen, StringBuilder sResult, eCodeType eCt, int bPOStagged);
如此即可以将分词结果传出到sResult参数中。这里需要提示的一点是在初始化StringBuilder类型参数的时候建议遵循ICTCLAS50.h中提示,为其分配待分词字符串长度六倍的空间,如:
StringBuilder sb = new StringBuilder(sParagraph.Length * 6);
如此可以避免分配的内存不足的问题。
另外需要其实的一点事是“字符编码类型定义”的问题:
//字符编码类型定义 public enum eCodeType { CODE_TYPE_UNKNOWN,//type unknown CODE_TYPE_ASCII,//ASCII CODE_TYPE_GB,//GB2312,GBK,GB10380 CODE_TYPE_UTF8,//UTF-8 CODE_TYPE_BIG5//BIG5 }
上面红字加粗部分需要注意,官方接口文档中没有 public,会造成可访问性较低的问题。如此一来,逐句分词的功能便可正常使用。
- 关于 C# 调用 ICTCLAS 逐句分词报异常的问题解决
- c# 调用ictclas.dll出现的异常
- JAVA调用 ICTCLAS 分词接口
- Java通过JNI调用ICTCLAS中文分词包的方法
- ICTCLAS的C#调用时的BUG
- 使用Java调用中科院分词NLPIR/ICTCLAS
- 使用Java调用中科院分词NLPIR/ICTCLAS
- Python调用NLPIR/ICTCLAS进行文本分词
- Python调用PYNIPIR(ICTCLAS)进行中文分词
- 关于使用NLPIR-ICTCLAS分词系统
- 全文检索4(关于中文分词ICTCLAS分词系统)
- ictclas分词系统的使用,java调用,附带连接mysql进行读写。
- 关于ictclas的网页
- 让中科院中文分词系统ICTCLAS为lucene所用的简单程序(C#版)
- 让中科院中文分词系统ICTCLAS为lucene所用的简单程序(C#版)
- 发布ICTCLAS分词模块的WebService
- Stanford分词,Parser以及ICTCLAS的使用
- 应用ICTCLAS的中文分词小程序
- 局部索引和全局索引
- android 自定义xml属性
- flex显示sprite
- POJ题目分类推荐
- centos 6.3 虚拟机 安装vmware tools
- 关于 C# 调用 ICTCLAS 逐句分词报异常的问题解决
- 使用LayoutOpt进行布局优化
- 关于分享窗口内容设计的一些思考
- 程序员编程艺术:第二章、字符串是否包含及匹配/查找/转换/拷贝问题
- ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes
- 写在愚人节前夜
- c++标准库——deque容器
- UVaOJ10050---Hartals
- IOC原理解释---控制反转