[置顶] 针对中科院汉语分词系统nlpir中的中文分词部分在java环境的部署(Linux和windows)(获取关键词)

时间:2021-09-15 17:28:12

主要部分详细代码:开发工具ecliplse;

本文没有做太详细的步骤解析:

但只需要在nlpir官网,下载你需要的文件就可以了,文件包括数据源 Data 文件夹,jna.4.0.0 jar包,NLPIR.dll或者NLPIR.so 文件,这些在下载的文件内都有;

具体在哪些地方用,看代码就可以了; 写完后 写一个main方法测试一下就可以了;


1)注意的问题:加载动态链接库,注意dll文件的存放位置;一般在ecliplse 中是存放在根目录下;

2)分词的词库文件的加载,也是在ecliplse根目录下;

3)以上一直作为一般的开发下,可以调试成功;但是如果部署在服务器的系统中应用到分词;就需要根据具体情况来加载动态链接库和数据源文件;


特别注意的是:在官网下载的代码,其实数据源 Data文件夹 中的nlpir.user文件,存在系统授权过期问题,当出现这种问题时,需要在官网下载最新版本的代码,将

nlpir.user替换即可;

最近发现NLPIR的分词突然无法运行,然后出现下面的错误:

    Not valid license or your license expired! Please feel free to contact pipy_zhang@msn.com!

都说下载最新的,但是我一直以为是从官网(http://ictclas.nlpir.org/downloads)下载(之前是在官网是做更新的)。

BUT,替换了都不行。

其实现在基本上是在github上上传维护的授权文件:

也是在官网下载页面,可以看到

NLPIR分词系统下载新增github链接

下载地址:https://github.com/NLPIR-team/NLPIR  下载你想用的授权文件就可以了



[置顶]        针对中科院汉语分词系统nlpir中的中文分词部分在java环境的部署(Linux和windows)(获取关键词)

import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;


import kevin.zhang.NLPIR;

import org.apache.log4j.Logger;
import org.openrdf.query.algebra.Str;

import com.sun.jna.Library;
import com.sun.jna.Native;


/**
 * @author 卡奇派对
 *
 */
public class Participles {
private static Logger logger = Logger.getLogger(Participles.class);
// 定义接口CLibraryLinux,windows环境 (64)
public interface CLibrary extends Library {
// 定义并初始化接口的静态变量
URL s = Participles.class.getClassLoader().getResource("");
String path = s.toString().substring(6,s.toString().indexOf("/WEB-INF"));

CLibrary Instance = (CLibrary) Native.loadLibrary(
path+"\\nlpir\\win64\\NLPIR", CLibrary.class);//此处加载动态链接库NLPIR.dll文件(此文件可在汉语分词系统官网下载)
//指定的路径动态加载
public int NLPIR_Init(String sDataPath, int encoding,
String sLicenceCode);

public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);//获取分词结果  接口


public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public String NLPIR_GetNewWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public int NLPIR_AddUserWord(String sWord);//add by qp 2008.11.10
public int NLPIR_DelUsrWord(String sWord);//add by qp 2008.11.10
public String NLPIR_GetLastErrorMsg();
public void NLPIR_Exit();
}
// 定义接口CLibraryLinux,Linux环境(64)
public interface CLibraryLinux extends Library {
// 定义并初始化接口的静态变量
CLibraryLinux InstanceLinux = (CLibraryLinux) Native.loadLibrary(
"NLPIR", CLibraryLinux.class);//加载动态链接库NLPIR.so文件(此文件可在汉语分词系统官网下载)下面有具体详解:1.0
public int NLPIR_Init(String sDataPath, int encoding,
String sLicenceCode);

public String NLPIR_ParagraphProcess(String sSrc, int bPOSTagged);


public String NLPIR_GetKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);//获取关键词
public String NLPIR_GetNewWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public String NLPIR_GetFileKeyWords(String sLine, int nMaxKeyLimit,
boolean bWeightOut);
public int NLPIR_AddUserWord(String sWord);//add by qp 2008.11.10
public int NLPIR_DelUsrWord(String sWord);//add by qp 2008.11.10
public String NLPIR_GetLastErrorMsg();
public void NLPIR_Exit();
}


/**
* @param str 需要获取关键词的字符串
* @param num 最多获取关键词个数

* @return list   

*/

//根据具体需求进行修改

public static List<String> getKeyWordsList(String str,int num){
URL s = Participles.class.getClassLoader().getResource("");
String path = s.toString().substring(6,s.toString().indexOf("/WEB-INF"));
String argu = path+"/nlpir";// 此路径是Data文件夹的父文件夹(自定义)
List<String> keyWordsList = null;
int charset_type = 1;
Properties props=System.getProperties(); //获得系统属性集     
String osName = props.getProperty("os.name"); //操作系统名称     
String osArch = props.getProperty("os.arch"); //操作系统构架  
int init_flag = 0;
if(osName.indexOf("Windows") != -1 && osArch.indexOf("64") != -1){
try {

init_flag = CLibrary.Instance.NLPIR_Init(argu, charset_type, "0");//windows7 64

} catch (Exception e) {
logger.error("Windows 分词初始化失败"+e.getMessage());
}
String nativeBytes = null;


if (0 == init_flag) {
nativeBytes = CLibrary.Instance.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!fail reason is "+nativeBytes);
return null;
}

String nativeStr = CLibrary.Instance.NLPIR_GetKeyWords(str, num,false);

String regex = " ";
String words = nativeStr.replaceAll(regex, "#").replaceAll("###", "#");
keyWordsList = Arrays.asList(words.split("#"));
}else{
try {
init_flag = CLibraryLinux.InstanceLinux.NLPIR_Init(argu, charset_type, "0");//Linux 64
} catch (Exception e) {
logger.error("Linux 分词初始化失败;"+e.getMessage());
}

String nativeBytes = null;


if (0 == init_flag) {
nativeBytes = CLibraryLinux.InstanceLinux.NLPIR_GetLastErrorMsg();
System.err.println("初始化失败!fail reason is "+nativeBytes);
return null;
}

String nativeStr = CLibraryLinux.InstanceLinux.NLPIR_GetKeyWords(str, num,false);

String regex = " ";
String words = nativeStr.replaceAll(regex, "#").replaceAll("###", "#");
keyWordsList = Arrays.asList(words.split("#"));
}

return keyWordsList;
}

}


详解1.0:

在Linux环境下nlpir.so文件的存放主要有3种方法:
1. 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
ln -s /where/you/install/lib/*.so /usr/lib sudo ldconfig


2.修改LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/where/you/install/lib:$LD_LIBRARY_PATH sudo ldconfig


3.修改/etc/ld.so.conf,然后刷新


vim /etc/ld.so.conf

add /where/you/install/lib

sudo ldconfig



以上作为参考,个人认为已经解释的很清楚了,毕竟具体情况具体分析,这些相信都没问题,都是小问题;本人邮箱:liubf995250@163.com