C++ NLPIR+FRISO 项目的中文分词功能添加

来源:互联网 发布:联想售后系统优化 编辑:程序博客网 时间:2024/05/23 19:14

几个月之前需要做一个在线教学资源的项目功能,由于涉及到中文资源搜索,且自觉功力尚浅只好在线上查找前辈们的中文搜索的一些做法。

比较幸运的是,当时确实没用多久时间就找到LCTCLAS张华平博士的NLPIR中文分词系统PS:此处附下载地址  http://ictclas.nlpir.org/newsdownloads?DocId=389  最初的时候,这个也比较好用,因为是win32项目,直接将解压好的win32下的动态库和依赖库放置在release/debug下,同时将解压后的Data文件夹放置在release/debug文件夹下。接下来在项目中配置好库的路径,之后就是自己调用库函数进行中文分词操作。

/*

m_InStr  需要进行中文分词的字符串

OutStr  分词操作之后的字符串数组

*/

BOOL ReadDIRFile::Cstr2strs(CString& m_InStr,vector<CString>& OutStr)

{
if (!NLPIR_Init())
{
int ErrNum=GetLastError();
return FALSE;
}
CString InStr,m_OutStr;//("陌生的人给我一支兰州"),m_OutStr;
LPWSTR lpStr = m_InStr.GetBuffer();
char TempSize[250];
int iLength = WideCharToMultiByte(CP_ACP, 0, lpStr, -1, NULL, 0, NULL, NULL);      
WideCharToMultiByte(CP_ACP, 0, lpStr, -1, TempSize, iLength, NULL, NULL);
m_OutStr=NLPIR_ParagraphProcess(TempSize,0);


while (-1!=m_OutStr.Find(' '))
{
int len=m_OutStr.Find(' ');
OutStr.push_back(m_OutStr.Left(len));
m_OutStr.Delete(0,len+1);
if (0==m_OutStr.GetLength())
{
break;
}
}

//增加对英文字符的特殊处理
//for (int cout=0;cout<OutStr.size();cout++)
//{
// char TEMP=OutStr[cout].GetAt(0);
// if (TEMP>0 || TEMP == 0)
// {
// OutStr[cout]=' '+OutStr[cout];
// }
//}

NLPIR_Exit();
return TRUE;
}

但是,万万没想到 7月1号,这天突然被告知,中文分词用不了了,单步运行之后发现是NLPIR_Init这个初始化函数搞的鬼,但是也搞不明白,7月之前项目一直运行的还不错。还在想,是不是早上那个万年难得一见的闰秒造成的(笑·~)。这个愁得呀,无奈之下又去找度娘,发现这个其实不是开源的,涉及到版权过期什么的。之后去大数据论坛那块发现也有同道中人。诶~想想,虽然,这个系统的分词还不错,但是不稳定呀,过段时间就用不了,这个就有点PS:绝对没有抱怨什么的,我等小菜鸟还谈不上对开源与否做过多评价。

无奈之下,只好另觅他法。

后又找到friso分词器,同样是想把这个东东用在自己的项目里面。在此附上friso下载地址:http://blog.csdn.net/wsplayer/article/details/38060179当然这个是前辈的一个版本发布贴,下载完之后又得考虑怎样把这东西搞成个能用的动态库,嘿嘿,菜鸟嘛,自己造不了轮子只好借花献佛喽,嗯,当然也能在借献之间体悟出一丝道理(哈哈,话有点多了),当然尊重原著此处附原帖地址:http://www.oschina.net/question/853816_135216  

1、新建工程

VS2010里新建工程

文件->新建->从现有的代码中创建项目(注意:把tst开头的.c文件去掉,此为测试代码)


2选择刚解压好的文件,里面找到src文件夹


3、项目类型:动态链接库


4、点击完成

5、项目属性上,加上时间优化

在release或debug的项目属性上->常规->全程优化->使用连接时间代码生成:



6、编译生成项目得到friso.dll和friso.lib



PS:盗图可耻!!(码完,小子就乖乖的匿了。。嘿嘿)

到此生成好friso的动态库,然后需要把库文件和头文件添加到项目中去(静态添加)。当然因为项目是纯C项目,所以在依据函数名寻址的时候与C++有所不同PS:大概是因为C++新增加了虚函数,多了个虚函数表,还有兼容了函数重载的特性。(哈哈,一会码完就去查清楚,评论区见)。所以,需要在

头文件  friso.h 的函数声明前后添加

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef __cplusplus
}
#endif

特此,配置完动态库,但是还是要配置friso的一个配置文件friso.ini

friso.charset = 1

friso.lex_dir = dict/GBK/

然后,将dict(应该是字典)文件夹放置到项目根目录下。

到此,应该算是大功告成!嘿嘿

(过程真的有点辛苦,小白一枚,自己搞不大出来只好东问问,西瞅瞅,但是,重要的是:自己明白自己在做什么!这个算是个笔记之类,后面有问题了再补充吧!奔跑吧~周末哈哈)



0 0
原创粉丝点击