ICTCLAS 字典保存的总结

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值