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;}

更多相关文章

  1. Android中Dialog中自定义EditView导致软键盘无法弹出
  2. Android ashmem的实现方式
  3. Android研究笔记一-Android的价值观
  4. Android Mediacodec H.265文件播放
  5. 全局共享变量(Android)
  6. Study on Android【五】--自定义ContentProvider的语义
  7. textview中有很多行,我只让它显示三行,最后显示...,我设置了androi
  8. 右值引用如何使用?总结右值引用实例用法
  9. asp.net下的中文分词检索工具分享

随机推荐

  1. MyBatis之Mapper XML 文件详解(二)-sql和
  2. 一个简单的案例帮你理解什么是SpringIOC(
  3. MYSQL认证
  4. Python对比其他语言有什么优劣势?
  5. 对职业生涯的思考
  6. 国内技术氛围到底怎么样呢
  7. Springboot整合mybatis多数据源(注解完整
  8. 帮你解读什么是Redis缓存穿透和缓存雪崩
  9. 说说Java的Comparable 与 Comparator
  10. Prometheus和Grafana监控Nacos