使用ictclas分词原理,导入词典内容中有:我@@un,我们@@ud等。分词输入“我”,结果中并没有把“我”标注为un

分词系统_ICTCLAS分词系统小试牛刀
ICTCLAS分词系统是个NB的系统,这几天找到了仔细试了试,效率奇高,比自己搞字典,分词算法效率不知高了很多倍,用起来也是非常简单的,BOSS需要导出自定义词库,然后用文章训练词库,不管了,反正可以使用了。DT地用hash做了两个星期,进度很慢,分析一本《天龙八部》,统计出现的词语频率(词语只是仅仅基于频率,在并没有字典的情况下无法实现智能分词!)大概要花费十几分钟,可见效率底下,而且内存200M左右。使用
ICTCLAS分词系统可以高效地实现分词。下面把过程贴出来。
使用方法,首先到网上下载ICTCLAS,因为我是windows下的C++实现,所以在下载,解压,里面有很好的Demo,Doc,copy
API目录下的所有文件(夹)到你所在的工程,在你的源文件加上
"ICTCLAS50.h"
#pragma comment(lib, "ICTCLAS50.lib") //ICTCLAS50.lib库加入到工程中
//your code here,可参考Demo里面的代码
大概的函数C++函数接口都在Doc文件下的文档中:
ICTCLAS_Init(const char* pszInitDir=NULL);初始化函数
如果初始化成功返回true, 否则返回false.
如初始化不成功,请查看ictclas.log文件了解详细错误原因.
&pszInitDir:初始化路径,应包含配置文件(Configure.xml)和词典目录(Data目录)以及授权文件(user.lic).
如果这些文件及目录在系统运行当前目录下,此参数可以为null。
ICTCLAS_Exit( );退出,释放内存
&成功返回true;否则返回false。&
unsigned int
ICTCLAS_ImportUserDict(const char *sFilename,eCodeType
//导入用户自定义词典
导入成功的词的个数
sFilename:
用户定义词典文件
eCT:编码格式&
int ICTCLAS_ParagraphProcess(const
char *sParagraph,int nPaLen,eCodeType eCt,int bPOStagged,char*
sResult);//对一段文字进行分词
返回结果缓冲区的指针(sResult)以及结果的长度R
sParagraph: 原始文字段
nPaLen:&&&
&文字段的长度
eCodeType:&&文字段的编码格式
bPOStagged: 需不需要根据标注集做标记 0 =
做标记 ; 1 = 不标记; 默认为1.
sResult:&&&
t_pstRstVec
ICTCLAS_ParagraphProcessA(const char *sParagraph,int
PaLen,eCodeType eCodeType,int bPOStagged,int
&nRstCnt);
//处理文字段
结果vector的指针,系统调用,用户无法分配以及释放
& //start position
& //length
POS_TAGGER
iPOS; //POS
sPOS[POS_SIZE];//word type
& int word_ID; //word_ID
& int word_ //Is the word of the
user's dictionary?(0-no,1-yes)
&// word weight
sParagraph: 原始文字段
nPaLen:&&&&
文字段长度
eCodeType:& 编码格式
bPOStagged:&
需不需要根据标注集做标记 0 = 做标记 ; 1 =
不标记; 默认为1.
nRstcnt:&&&
处理结果的长度值。
详细用法参见Doc文件。
ICTCLAS_FileProcess(const char *sSrcFilename,eCodeType eCt,const
char *sDsnFilename,int bPOStagged);//处理txt文件
处理文本文件成功返回true,&否则返回false
sSourceFilename: 原始处理文件
eCodeType:
原始文件编码格式
sDsnFilename: &
&存储结果的文件名T
bPOStagged: & &
&需不需要根据标注集做标记
0 = 做标记 ; 1 = 不标记; 默认为1.
调用此函数之前需要调用init函数成功,输出格式可以通过ICTCLAS&配置来更改,这个需要研究下配置文件。
ICTCLAS_SetPOSmap(int nPOSmap);//设置标注集
成功为1,其他为0
ICT_POS_MAP_FIRST
&计算所一级标注集
ICT_POS_MAP_SECOND
&计算所二级标注集 & &
&&PKU_POS_MAP_SECOND
& 北大二级标注集 & &
&&PKU_POS_MAP_FIRST
& & 北大一级标注集&
int ICTCLAS_GetWordId(const char
*sWord,int nWrdLen,eCodeType eCT);
单词的ID(我觉得是词典里面的存储位置,不清楚词典的具体结构)
sWord: 目标单词
eCodeType:
bool &ICTCLAS_ResultFree
( t_pstRstVec&
//释放调用
成功为1,失败为0
t_pstRstVec:
ICTCLAS_ParagraphProcessAW得到的vector指针
总结:这些函数都很好用,我需要使用处理文件函数我出现的问题是:单独调用这个函数没有问题,但是在MFC界面调用两个选择打开文件路径和保存结果文件路径的CFileDialog以后就会出现ICTCLAS_Init初始化失败!郁闷了半天,查看ICTCLAS.log文件,
Default Path :
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS&
License succeed!Cannot open user
dictionary
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pdat.
Cannot open file
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.map.
Cannot open user dictionary
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pos.
Load dictionary down!
并没有异常,加载失败是因为并没有自定义词典。
仔细排查,发现bool
ICTCLAS_Init(const char*
pszInitDir=NULL)有一个默认的工作路径,在没有打开CFileDialog的时候默认的路径是exe文件执行路径,但是打开以后若不进行设置,会改变工作路径!这就是为什么点击CFileDialog路径更改,找不到路径下的文件,当然无法初始化了!(&pszInitDir:初始化路径,应包含配置文件(Configure.xml)和词典目录(Data目录)以及授权文件(user.lic).
如果这些文件及目录在系统运行当前目录下,此参数可以为null)
解决方案:
方案1. 在每次调用CFileDialog打开文件后重新设置工作路径
方案2. 在程序中使用绝对路径
CFileDialog的构造函数有8个参数,平时为了省事一般只是指定第一个。其实解决这个问题,只要在第四个参数dwFlags中加上OFN_NOCHANGEDIR即可
我使用第三个方法解决了^_^!后面我会贴出最终分词的代码。还有中间碰见的一些东西(关于cstring LPSCSTR char*
const char * UNICODE 和
multibyte我已经被微软折磨得不行了,无力吐槽,有时间在说吧)!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。有任何建议或问题请联系[转载]ictclas导入用户词典
中科院的分词器,导入用户自定义词典时,原来的说明文件有些bug,实际上给的例子里用的函数不是ICTCLAS_ImportUserDictFile,容易让人造成误解。
另外,用户字典格式为1.词语与词性用‘@@’间隔;2.词与词之间用 半角‘;’间隔;3.词性可省略例如:“中科院@@分词 v;系统@@……;”,或者:“中科院;分词;系统;……;”
但是仍然有几个bug需要指出来,1,用户词典的第一行没有被倒入到分词器里,真是坑爹啊。所以用户在写用户词典时记得加个空行;2,用户词典的词的优先级貌似太高了。我在用户词典里加了“万科”这个词,结果测试语句“千万科学家”也被分成了“千/
万科/ 学/ 家”,简直无语了。
附录:导入用户字典函数
ICTCLAS_ImportUserDictFile
user-defined dictionary from a text file.
ICTCLAS_API unsigned int ICTCLAS_ImportUserDictFile(const
char* pszFileName, eCodeType=CODE_TYPE_UNKNOWN );
Required Header
ICTCLAS_ImportUserDictFile
&ICTCLAS50.h&
Return Value
The number of lexical entry imported
successfully
Parameters
pszFileName: Text filename for user
dictionary
codeType:Character encoding type
The ICTCLAS_ImportUserDict function works
properly only if ICTCLAS_Init succeeds.
The text dictionary file foramt see User-defined
You only need to invoke the function while you
want to make some change in your customized lexicon or first use
the lexicon. After you import once and make no change again,
ICTCLAS will load the lexicon automatically if you set UserDict
"on" in the configure file. While you turn UserDict "off",
user-defined lexicon would not be applied.
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 ictclas2016分词系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信