主要部分详细代码:开发工具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 下载你想用的授权文件就可以了
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
3.修改/etc/ld.so.conf,然后刷新
vim /etc/ld.so.conf
add /where/you/install/lib
以上作为参考,个人认为已经解释的很清楚了,毕竟具体情况具体分析,这些相信都没问题,都是小问题;本人邮箱:liubf995250@163.com