在使用ICTCLAS的时候,有一个很方便和很好的便是可以加载用户自己的词典,例如“屮艸芔茻”我们可以保存在自己的词典中,然后遇到这四个字时就可以把它当做一个整体识别出来。
但是有一个问题要面对的,例如我现在有两个文本都作为用户词典,那么在能否把两个文本都加载到用户词典呢,接下来就是针对这个问题的探索。
Test.txt (待测试分词txt)
又双叒叕
火炎焱燚
屮艸芔茻
TestMydic1.txt (词典1)
又双叒叕
火炎焱燚
TestMydic2.txt (词典2)
屮艸芔茻
TestResult0.txt,TestResult1.txt,TestResult2.txt分别是程序运行时没有加载词典的分词结果txt,加载词典1后的分词txt,加载词典2后的分词txt。
1:加载词典1,加载词典2 ,字典1,2都保存
我们发现没有3中分词结果分别是:
<1> TestResult0.txt
又双 叒 叕
火炎 焱 燚
屮艸 芔 茻
<2> TestResult1.txt
又双叒叕
火炎焱燚
屮艸 芔 茻
<3> TestResult2.txt
又双 叒 叕
火炎 焱 燚
屮艸芔茻
重新运行程序后,发现<1>发生变化,分词结果是:
又双 叒 叕
火炎 焱 燚
屮艸芔茻
从上面可以看出,后面加载的词典会把前面加载的词典覆盖掉,并没有实现两个词典合并。后面加载的词典最后被保存下来,并在程序下一次运行的时候实现了分词。
2:加载词典1,加载词典2,词典1保存,词典2不保存(连续运行两次)
<1> TestResult0.txt
又双叒叕
火炎焱燚
屮艸 芔 茻
<2> TestResult1.txt
又双叒叕
火炎焱燚
屮艸 芔 茻
<3> TestResult2.txt
又双 叒 叕
火炎 焱 燚
屮艸芔茻
从上面可以发现,在程序运行的时候,后面加载的词典依然会覆盖前面的词典,但是如果后面的词典没有进行保存的话,程序最后保存的词典就会使第一次保存的词典,即便之前在程序运行时候他被后面词典覆盖。
源码:
#include<stdio.h> #include<stdlib.h> #include<fstream> #include<string> #include<map> #include<vector> #include<iostream> #include"API\ICTCLAS50.h" #pragma comment(lib ,".\\API\\ICTCLAS50.lib") using namespace std; bool loadDictionary(const char* Dic,bool bSave); int main(int argc, char* argv[]) { if(!ICTCLAS_Init(".\\API")) { printf("Init fails\n"); return -1; } else { printf("Init OK\n"); } /*设置分词效果:ICT_POS_MAP_FIRST 计算所一级标注集 ICT_POS_MAP_SECOND 计算所二级标注集 PKU_POS_MAP_SECOND 北大二级标注集 PKU_POS_MAP_FIRST 北大一级标注集*/ ICTCLAS_SetPOSmap(3); ICTCLAS_FileProcess("Test.txt","TestResult0.txt",CODE_TYPE_UNKNOWN,0); //核心函数,导入用户词典,以使匹配专一化 loadDictionary("TestMydic1.txt",true); ICTCLAS_FileProcess("Test.txt", "TestResult1.txt",CODE_TYPE_UNKNOWN,0); loadDictionary("TestMydic2.txt",false); ICTCLAS_FileProcess("Test.txt","TestResult2.txt",CODE_TYPE_UNKNOWN,0); ICTCLAS_Exit(); return 0; } bool loadDictionary(const char* Dic,bool bSave) { unsigned int nItems= ICTCLAS_ImportUserDictFile(Dic,CODE_TYPE_UNKNOWN); if(bSave) { ICTCLAS_SaveTheUsrDic();//保存用户词典 std::cout<<"the dictionary is saved now!"<<endl; } if(nItems) { cout<<"Load dictionary succesfully!\n"; } else { cout<<"Load dictionary unsuccefully!\n"; return false; } return true; }