Android平台由于资源有限,不可能像电脑那样去跑斯坦福的模型,即使能跑速度肯定也是很慢的,但是Android端的语义理解又是那么迫切,现在语音识别工具越来越多,智能悄悄走近,所以实现Android端的NLP基础功能很有必要。
言归正传,我用的是哈工大的分词工具(Language Technology Platform Cloud, LTP),官网地址http://www.ltp-cloud.com/,现在提供了云服务,可以直接使用HttpURLConnection访问。但是HttpURLConnection不能在主进程里面使用,需要使用线程调用,假如把访问的代码全部写在Activity里面没有问题,但是会显得冗杂。所以:
1、我首先定义了一个网络访问类HttpConnectLtp,这个类的构造函数传入的是:待处理的字符串txt,与处理模式pat,代码如下:
package com.example.ziyi;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class HttpConnectLtp extends Thread{
public String api_key;
public String pattern;
public String format;
public String text = "";
public String result="";
public HttpConnectLtp(String txt,String pat){
api_key = "";//api_key,申请账号后生成,免费申请。
pattern = pat;//ws表示只分词,除此还有pos词性标注、ner命名实体识别、dp依存句法分词、srl语义角色标注、all全部
format = "plain";//指定结果格式类型,plain表示简洁文本格式
text = txt;
}
@Override
public void run(){
URL url;
try {
url = new URL("http://api.ltp-cloud.com/analysis/?"
+ "api_key=" + api_key + "&"
+ "text=" + text + "&"
+ "format=" + format + "&"
+ "pattern=" + pattern);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.connect();
BufferedReader innet = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
StringBuilder sb=new StringBuilder();
String line=null;
while((line=innet.readLine())!=null){
sb.append(line);
}
result = sb.toString();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、定义一个不同的模式的类,这个类包含不同的方法,如分词,NER等等。代码如下:
package com.example.util;
import com.example.ziyi.HttpConnectLtp;
public class LtpCloud {
public String split(String text){
HttpConnectLtp htp = new HttpConnectLtp(text, "ws");
htp.start();
try {
htp.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return htp.result;
}
public String NER(String text){
HttpConnectLtp htp = new HttpConnectLtp(text, "ner");
htp.start();
try {
htp.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return htp.result;
}
}
这里有一点很重要,就是需要网络访问进程执行完之后才能返回结果,所以使用htp.join()操作。假如需要做的是依存句法分析,则只需要修改模式为“dp”即可:
public String DependencyParsing(String text){
HttpConnectLtp htp = new HttpConnectLtp(text, "dp");
htp.start();
try {
htp.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return htp.result;
}