简单的分词器

package lele;

import org.ansj.domain.Result;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.NlpAnalysis;
import org.apache.hadoop.hive.ql.exec.UDF;

import java.io.Serializable;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CwsV2UDF extends UDF {
        // 用于标记用于去重的natureSet是否已经初始化的标志位
                            public boolean natureSetHaveInitFlag = false;
                // 用于词性过滤的set集合初始化
                        public Set<String> natureSet = new HashSet<String>();
                public String evaluate(String input, String natureStr) {
                                // 如果输入为空,则直接返回空即可
                                if (input == null || input.trim().length() == 0) {
                                                return null;
                                }
        //白名单的Set集合初始化,只需要初始化一次即可反复使用
                                if (!natureSetHaveInitFlag && natureStr != null) {
                                                String[] natureArray = natureStr.split(",");
                                                for (String nature : natureArray) {
                                                                natureSet.add(nature);
                                                }
                                                natureSetHaveInitFlag = true;
                                }
                                // 采用nlp分词,具备(用户自定义词典/数字识别/人名识别/机构名识别/新词发现)功能
                                Result result = NlpAnalysis.parse(input);
                                // 如果处理结果为null,则直接返回一个null即可
                                if (result == null || result.getTerms() == null) {
                                                return null;
                                }
                                // 将分词结果集合返回给变量itemList
                                List<Term> termList = result.getTerms();
                                // 存储每次分词完成后的词序列集合,词之间以'\001'分隔
                                StringBuilder stringBuilder = new StringBuilder();
                                // 循环记数器,当counter>0的时候,每次添加元素前先添加分隔符
                                int counter = 0;
                                // 遍历集合,加入结果集中
                                for (Term term : termList) {
                             // 判断分词的Term的词性是否包含在词性的白名单中,如果在则加入,否则忽略掉
                        if (natureSet.contains(term.getNatureStr())) {
                             if (counter > 0) {
                                      stringBuilder.append('\001');
                             }
                             stringBuilder.append(term.getName());
                             counter++;
                        }
                                }
                                return stringBuilder.toString();
                }
                public static void main(String[] args) {
                                String natureList = "n,nr,nr1,nr2,nrj,nrf,ns,nsf,nt,nz,nl,ng,nw,v,vd,vn,vf,vx,vi,vl,vg,a,ad,an,ag,al";
                                new CwsV2UDF().evaluate(args[0], natureList);
                }
}

注:如果需要在Scala项目中引用,需在类名后加

implements Serializable   
public class CwsV2UDF extends UDF implements Serializable

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值