当前位置:   article > 正文

hanlp分词_handlp pom

handlp pom

首先在pom文件中加入分词处理的JAR包

  1. <dependency>
  2. <groupId>com.hankcs</groupId>
  3. <artifactId>hanlp</artifactId>
  4. <version>portable-1.6.1</version>
  5. </dependency>

1、创建封装分词数据的Bean

  1. package com.qlys.frame.model.impl;
  2. import java.io.Serializable;
  3. import java.util.concurrent.atomic.AtomicInteger;
  4. /**
  5. * 分词基本信息
  6. */
  7. public class SegmentWord implements Serializable {
  8. /**
  9. *
  10. */
  11. private static final long serialVersionUID = 5662341029767237202L;
  12. // 词名
  13. private String name;
  14. // 词性
  15. private String pos;
  16. // 词频
  17. private AtomicInteger frequency = new AtomicInteger();
  18. public SegmentWord(String name,String pos) {
  19. this.name = name;
  20. this.pos = pos;
  21. }
  22. public String getName() {
  23. return name;
  24. }
  25. public void setName(String name) {
  26. this.name = name;
  27. }
  28. public String getPos() {
  29. return pos;
  30. }
  31. public void setPos(String pos) {
  32. this.pos = pos;
  33. }
  34. public AtomicInteger getFrequency() {
  35. return frequency;
  36. }
  37. public void setFrequency(AtomicInteger frequency) {
  38. this.frequency = frequency;
  39. }
  40. }

2、进行分词并形成词频信息

  1. package com.qlys.frame.util;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Optional;
  6. import java.util.concurrent.ConcurrentHashMap;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import com.hankcs.hanlp.corpus.tag.Nature;
  10. import com.hankcs.hanlp.seg.common.Term;
  11. import com.hankcs.hanlp.tokenizer.NLPTokenizer;
  12. import com.qlys.frame.model.impl.SegmentWord;
  13. /**
  14. * 分词处理工具类
  15. */
  16. public class TokenizerUtil {
  17. private static final Logger log = LoggerFactory.getLogger(TokenizerUtil.class);
  18. /**
  19. * 分词策略
  20. * @return 分词信息
  21. */
  22. public List<Term> segmentCategory(String content){
  23. return NLPTokenizer.segment(content);
  24. }
  25. /**
  26. * 分词并计算词频
  27. * @param content 需要进行分词的文本
  28. * @return 分词后的词组信息及词频
  29. */
  30. public Map<String, SegmentWord> segment(String content) {
  31. log.debug("开始执行分词");
  32. List<Term> termList = this.segmentCategory(content);
  33. Map<String, SegmentWord> map = new ConcurrentHashMap<String, SegmentWord>();
  34. termList.forEach(i -> Optional.ofNullable(i.nature == Nature.w ? null : i.nature).ifPresent(m -> map
  35. .computeIfAbsent(i.word, k -> new SegmentWord(i.word, i.nature.toString())).getFrequency().incrementAndGet()));
  36. return map;
  37. }
  38. /**
  39. * 相似度运算
  40. *
  41. * @param s 分词1
  42. * @param o 分词2
  43. * @return 分词1和分词2的相似度
  44. */
  45. public double similarity(Map<String, SegmentWord> s,Map<String, SegmentWord> o) {
  46. List<String> keys = new ArrayList<String>();
  47. keys.addAll(s.keySet());
  48. keys.retainAll(o.keySet());
  49. //运算分子数据
  50. return keys.stream().map(val->s.get(val).getFrequency().intValue()*o.get(val).getFrequency().intValue()).reduce((a,b)->a+b).get()
  51. /
  52. Math.sqrt(s.values().stream().map(val->Math.pow(val.getFrequency().intValue(),2)).reduce((a,b)->a+b).get())
  53. / Math.sqrt(o.values().stream().map(val->Math.pow(val.getFrequency().intValue(),2)).reduce((a,b)->a+b).get());
  54. }
  55. public static void main(String[] args) {
  56. TokenizerUtil util = new TokenizerUtil();
  57. Map<String, SegmentWord> map = util.segment("我们把香蕉给猴子因为它们饿了");
  58. Map<String, SegmentWord> map1 = util.segment("我们不能把香蕉给猴子因为它们还没有成熟");
  59. System.out.println(util.similarity(map, map1));
  60. System.out.println(util.similarity(util.segment("abc123"), util.segment("abc")));
  61. }
  62. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号