海量的中文分词组件使用
来源:互联网 发布:整型数据包括 编辑:程序博客网 时间:2024/06/03 10:45
海量的中文分词组件(HLSSplit.dll),是用C++写的.在java下调用,就要用JNI技术.
前段时间做了一个.希望和大家分享一下.关于JNI技术,网上有很多的介绍,还不太了解的朋友,可以去网上看看,很简单,看看就明白.
首先在写一个类,这个是在JAVA下的调用类.
public class fc ......{
public fc()......{
HLSplitInit();
}
public synchronized native byte[] seg(byte[] text);//分词
public synchronized native void HLSplitInit();//初始化
public synchronized native void HLOpenUsrDict(byte[] fileName);//装载用户自定义词典
public static void main(String[] args) ......{
fc a=new fc();
char c=0;
String str="供应止回阀"+c;
//String str = "潘岳与邱晓华指出,这次核算得出的结果虽不完整,但也足以对现实全貌有所估计。这些数字再次证明了,环境危机正在越来越严重地制约经济发展";
String s=new String(a.seg(str.getBytes()));
System.out.print(s);
}
static......{
System.setProperty("java.library.path",System.getProperty("java.class.path"));
System.loadLibrary("fc");
}
}
其中的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 <windows.h>
#include "jni.h"
#include "fc.h"
#include<stdio.h>
#include "HLSegFunc.h"
#include <string.h>
JNIEXPORT void JNICALL Java_fc_HLSplitInit(JNIEnv *, jobject)
{
HLSplitInit();
}
JNIEXPORT void JNICALL 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);
int j=HLGetWordCnt(h);
jbyteArray d=(env)->NewByteArray(strlen(ptr)+j);
int k=0;
char *sep=" ";
for(int i=0;i<j;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);
return d;
}
然后,编译就可以了.
把fc.class,fc.dll,HLSSplit.dll,HLSplitWord.dat,方面一个文件夹中,执行可以看到结果了.
我写这个,是要在Nutch,实现中文分词,不过,我试了试,感觉有这样的问题:因为它是基于上面文的分词,所以,不同的时候分词的结果不同,这样就给我们在搜索的时候造成了问题,比如"美白是永远的热门话题",这句话的分词结果是: 美/白/是/永远/的/热门/话题,而如果输入"美白"两个字,它就不分词了,这样就导致我们找不到上面的这句话了.产生这样的原因,我认为是词典里面没有"美白"这个词.所以当你把它用到搜索引擎的分词是,要注意这点.
网上有很多研究Nutch中加入中文分词技术文章,我觉得多少有些问题.过些天,我把我实现的过程,给大家分享一下,看看有没有什么问题.
前段时间做了一个.希望和大家分享一下.关于JNI技术,网上有很多的介绍,还不太了解的朋友,可以去网上看看,很简单,看看就明白.
首先在写一个类,这个是在JAVA下的调用类.
public class fc ......{
public fc()......{
HLSplitInit();
}
public synchronized native byte[] seg(byte[] text);//分词
public synchronized native void HLSplitInit();//初始化
public synchronized native void HLOpenUsrDict(byte[] fileName);//装载用户自定义词典
public static void main(String[] args) ......{
fc a=new fc();
char c=0;
String str="供应止回阀"+c;
//String str = "潘岳与邱晓华指出,这次核算得出的结果虽不完整,但也足以对现实全貌有所估计。这些数字再次证明了,环境危机正在越来越严重地制约经济发展";
String s=new String(a.seg(str.getBytes()));
System.out.print(s);
}
static......{
System.setProperty("java.library.path",System.getProperty("java.class.path"));
System.loadLibrary("fc");
}
}
其中的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 <windows.h>
#include "jni.h"
#include "fc.h"
#include<stdio.h>
#include "HLSegFunc.h"
#include <string.h>
JNIEXPORT void JNICALL Java_fc_HLSplitInit(JNIEnv *, jobject)
{
HLSplitInit();
}
JNIEXPORT void JNICALL 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);
int j=HLGetWordCnt(h);
jbyteArray d=(env)->NewByteArray(strlen(ptr)+j);
int k=0;
char *sep=" ";
for(int i=0;i<j;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);
return d;
}
然后,编译就可以了.
把fc.class,fc.dll,HLSSplit.dll,HLSplitWord.dat,方面一个文件夹中,执行可以看到结果了.
我写这个,是要在Nutch,实现中文分词,不过,我试了试,感觉有这样的问题:因为它是基于上面文的分词,所以,不同的时候分词的结果不同,这样就给我们在搜索的时候造成了问题,比如"美白是永远的热门话题",这句话的分词结果是: 美/白/是/永远/的/热门/话题,而如果输入"美白"两个字,它就不分词了,这样就导致我们找不到上面的这句话了.产生这样的原因,我认为是词典里面没有"美白"这个词.所以当你把它用到搜索引擎的分词是,要注意这点.
网上有很多研究Nutch中加入中文分词技术文章,我觉得多少有些问题.过些天,我把我实现的过程,给大家分享一下,看看有没有什么问题.
- 海量的中文分词组件使用
- 海量的中文分词组件(HLSSplit.dll).在java下调用
- 中文分词组件
- scws中文分词组件
- scws中文分词组件
- scws中文分词组件
- scws中文分词组件
- scws中文分词组件
- scws中文分词组件
- Python中文分词组件
- 中文分词组件
- 中文分词软件包的使用
- Ansj中文分词的使用
- 中文分词 JE-Analysis 组件使用外部自定义词典
- 详解如何使用SQL中文分词组件查询表记录
- 日语分词组件sen的使用 -- 分词(一)
- Nutch 中文分词 庖丁分词组件
- Java中文分词组件 - word分词
- New妙用和WinForm的Enabled=false时字体不可改变的解决方案
- artDialog的修改记录
- MapReduce:超大机群上的简单数据处理
- 广州亿能自动化测试沙龙 - 自动化测试管理平台设计 [ 沙龙PPT免费下载 ]
- [android] 如何判断程序是否在前台运行
- 海量的中文分词组件使用
- 分布式信息检索
- Hadoop分布式文件存储系统
- java相关技术资源列表
- Hadoop-- 海量文件的分布式计算处理方案
- hadoop 分布式文件系统安装
- 开源使用
- android解析pdf文件muPdf
- Eclipse 快捷键使用