split java 中文_海量的中文分词组件(HLSSplit.dll).在java下调用 | 学步园

海量的中文分词组件(HLSSplit.dll),是用C++写的.在java下调用,就要用JNI技术.

前段时间做了一个.希望和大家分享一下.关于JNI技术,网上有很多的介绍,还不太了解的朋友,可以去网上看看,很简单,看看就明白.

首先在写一个类,这个是在JAVA下的调用类.

ExpandedBlockStart.gif

ContractedBlock.gifpublicclassfc ......{

6a9c071a08f1dae2d3e1c512000eef41.png 

6a9c071a08f1dae2d3e1c512000eef41.png  

ExpandedSubBlockStart.gif

ContractedSubBlock.gifpublicfc()......{

6a9c071a08f1dae2d3e1c512000eef41.png      HLSplitInit();

ExpandedSubBlockEnd.gif  }6a9c071a08f1dae2d3e1c512000eef41.png  

6a9c071a08f1dae2d3e1c512000eef41.pngpublicsynchronizednativebyte[] seg(byte[] text);//分词6a9c071a08f1dae2d3e1c512000eef41.png6a9c071a08f1dae2d3e1c512000eef41.pngpublicsynchronizednativevoidHLSplitInit();//初始化6a9c071a08f1dae2d3e1c512000eef41.png6a9c071a08f1dae2d3e1c512000eef41.pngpublicsynchronizednativevoidHLOpenUsrDict(byte[] fileName);//装载用户自定义词典6a9c071a08f1dae2d3e1c512000eef41.png6a9c071a08f1dae2d3e1c512000eef41.png  

ExpandedSubBlockStart.gif

ContractedSubBlock.gifpublicstaticvoidmain(String[] args) ......{

6a9c071a08f1dae2d3e1c512000eef41.png      fc a=newfc();

6a9c071a08f1dae2d3e1c512000eef41.png      

6a9c071a08f1dae2d3e1c512000eef41.pngcharc=0;

6a9c071a08f1dae2d3e1c512000eef41.png      String str="供应止回阀"+c;

6a9c071a08f1dae2d3e1c512000eef41.png            

6a9c071a08f1dae2d3e1c512000eef41.png//String str = "潘岳与邱晓华指出,这次核算得出的结果虽不完整,但也足以对现实全貌有所估计。这些数字再次证明了,环境危机正在越来越严重地制约经济发展";6a9c071a08f1dae2d3e1c512000eef41.png6a9c071a08f1dae2d3e1c512000eef41.png      String s=newString(a.seg(str.getBytes()));

6a9c071a08f1dae2d3e1c512000eef41.png      

6a9c071a08f1dae2d3e1c512000eef41.png      System.out.print(s);

ExpandedSubBlockEnd.gif  }6a9c071a08f1dae2d3e1c512000eef41.png 

ExpandedSubBlockStart.gif

ContractedSubBlock.gifstatic......{

6a9c071a08f1dae2d3e1c512000eef41.png       

6a9c071a08f1dae2d3e1c512000eef41.png    System.setProperty("java.library.path",System.getProperty("java.class.path"));

6a9c071a08f1dae2d3e1c512000eef41.png    System.loadLibrary("fc");

6a9c071a08f1dae2d3e1c512000eef41.png    

ExpandedSubBlockEnd.gif  }ExpandedBlockEnd.gif}

其中的Main()函数里面的内容,是显示调用的方面,在实际的JNI中没有作用.

char c=0;

String str="供应止回阀"+c; 这样写的原因是C中字符串是有/0结束的.

执行JAVA fc.java ,然后执行JAVAH fc,产生fc.h头文件.

下面创建用VC6.0创建一个空DLL工程,

然后向工程中添加fc.h,jni.h,HLSegFunc.h,HLPubDef.h,HLSSplit.lib

添加一个.cpp文件,写入下面的代码

#include#include"jni.h"#include"fc.h"#include#include"HLSegFunc.h"#includeJNIEXPORTvoidJNICALL Java_fc_HLSplitInit(JNIEnv*, jobject)

{

HLSplitInit();

}

JNIEXPORTvoidJNICALL Java_fc_HLOpenUsrDict (JNIEnv*env, jobject b, jbyteArray c)

{

jbyte*arrayBody=(env)->GetByteArrayElements(c,0);char*ptr=(char*)arrayBody;

HLOpenUsrDict(ptr);

}

JNIEXPORT jbyteArray JNICALL Java_fc_seg (JNIEnv*env, jobject b, jbyteArray c)

{

jbyte*arrayBody=(env)->GetByteArrayElements(c,0);char*ptr=(char*)arrayBody;

HANDLE h=HLOpenSplit();

HLSplitWord(h ,ptr,HL_CAL_OPT_SEARCH);intj=HLGetWordCnt(h);

jbyteArray d=(env)->NewByteArray(strlen(ptr)+j);intk=0;char*sep="";for(inti=0;i

{

SHLSegWord*pWord=HLGetWordAt(h , i);

env->SetByteArrayRegion(d,k,strlen(pWord->s_szWord),(jbyte*)pWord->s_szWord);

k+=strlen(pWord->s_szWord);

env->SetByteArrayRegion(d,k,1,(jbyte*)sep);

k+=1;

}

HLCloseSplit(h);returnd;

}

然后,编译就可以了.

把fc.class,fc.dll,HLSSplit.dll,HLSplitWord.dat,方面一个文件夹中,执行可以看到结果了.

我写这个,是要在Nutch,实现中文分词,不过,我试了试,感觉有这样的问题:因为它是基于上面文的分词,所以,不同的时候分词的结果不同,这样就给我们在搜索的时候造成了问题,比如"美白是永远的热门话题",这句话的分词结果是: 美/白/是/永远/的/热门/话题,而如果输入"美白"两个字,它就不分词了,这样就导致我们找不到上面的这句话了.产生这样的原因,我认为是词典里面没有"美白"这个词.所以当你把它用到搜索引擎的分词是,要注意这点.

网上有很多研究Nutch中加入中文分词技术文章,我觉得多少有些问题.过些天,我把我实现的过程,给大家分享一下,看看有没有什么问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值