在使用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;
}