使用Android调用LTP Cloud实现分词

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;
	}
相关文章
相关标签/搜索