使用Android调用LTP Cloud实现分词
16lz
2021-01-24
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{publicStringapi_key;publicStringpattern;publicStringformat;publicStringtext = "";publicString result="";public HttpConnectLtp(String txt,String pat){api_key = "";//api_key,申请账号后生成,免费申请。 pattern = pat;//ws表示只分词,除此还有pos词性标注、ner命名实体识别、dp依存句法分词、srl语义角色标注、all全部 format = "plain";//指定结果格式类型,plain表示简洁文本格式 text = txt;}@Overridepublic 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 blocke.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 blocke.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 blocke.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 blocke.printStackTrace();}return htp.result;}
更多相关文章
- Android中Dialog中自定义EditView导致软键盘无法弹出
- Android ashmem的实现方式
- Android研究笔记一-Android的价值观
- Android Mediacodec H.265文件播放
- 全局共享变量(Android)
- Study on Android【五】--自定义ContentProvider的语义
- textview中有很多行,我只让它显示三行,最后显示...,我设置了androi
- 右值引用如何使用?总结右值引用实例用法
- asp.net下的中文分词检索工具分享