调用 ICTCLAS5 分词的一点问题

 下午用ICTCLAS5.0分词的时候,发现了以前没注意过的问题。

ICTCLAS5.0的库函数比以前的版本少了,参数也发生了一些变化。

以前分词都是照抄demo,调用ICTCLAS_ParagraphProcess,得到分词并标注好词性的结果字符。然后再从结果字符串中将词语一个个抽取出来。

今天才发现库函数中还有ICTCLAS_ParagraphProcessA这个好东西。该函数返回的是词串结构的数组,省去了调用ParagraphProcess后还要逐个抽取单词的过程。该函数唯一的不便就是,词串结构体tagICTCLAS_Result中没有直接存储切分后的词语,而是保存了词语在源串中的起始位置和长度。不过有了位置和长度,提取词串便再容易不过了。

//调用ICTCLAS_ParagraphProcessA分词 void GetTokenFromFile2(char* szFileName, bool isNeedUserDict = false, char * szUserDict = NULL) { fstream fileArticle(szFileName, std::ios::in); if (fileArticle.fail()) { cout << "No /"" << szFileName << "/" file!" << endl; return; } if (!ICTCLAS_Init("ICTCLAS"))//初始化分词组件。 { exit(0); } //设置词性标注集(0 计算所二级标注集,1 计算所一级标注集,2 北大二级标注集,3 北大一级标注集) ICTCLAS_SetPOSmap(0); if (isNeedUserDict && szUserDict != NULL) { unsigned int nItems=ICTCLAS_ImportUserDictFile(szUserDict, CODE_TYPE_UNKNOWN); cout << "Successfully add " << nItems << " user_words!" << endl; } //ICTCLAS_SaveTheUsrDic();保存用户词典至Data文件夹下 char strContent[STRING_LENGTH] = "";// 需要分词的内容 unsigned int nParaLen = 0; //需要分词的长度 int nResultLen=0; //分词结果的长度 while (!fileArticle.eof()) { memset(strContent, 0, STRING_LENGTH); fileArticle.getline(strContent, STRING_LENGTH, '/n'); //cout << strContent << endl; //test nParaLen = strlen(strContent); LPICTCLAS_RESULT vecRst = ICTCLAS_ParagraphProcessA(strContent, nParaLen, nResultLen, CODE_TYPE_UNKNOWN, true); string strChnWord; for (int i=0; i<nResultLen; ++i) { for (int j=0; j<vecRst[i].iLength; j++) { strChnWord += strContent[j+vecRst[i].iStartPos]; } cout << strChnWord << "/" << vecRst[i].szPOS << endl; strChnWord = ""; } ICTCLAS_ResultFree(vecRst); } ICTCLAS_Exit(); fileArticle.close(); }

 

值得注意的是,用ICTCLAS5分词时,空格被作为标点符号处理。比如对于一个英文句子“Hello world !”

调用ICTCLAS_ParagraphProcess分词的结果是  “Hello/x  world/x  !/wt”,看似没有处理空格。

而调用ICTCLAS_ParagraphProcessA是可以看到“Hello/x  /w  world/x  /w !/wt”。空格是被当做标点符号处理的。

空格并不是一个具有意义的单位,对于分词后的应用是有影响的。因此,要注意规避。

 

 

 

 

 

你可能感兴趣的:(ios,String,user,File,null,存储)