当前位置: 首页 > news >正文

Hanlp的学习

参考:HanLP 自然语言处理使用总结-CSDN博客

参考:Sprint Boot 工程中HanLP配置相对路径,始终有问题的解决方案_springboot hanlp-CSDN博客

<!--hanlp 依赖--><dependency><groupId>com.hankcs</groupId><artifactId>hanlp</artifactId><version>portable-1.8.4</version></dependency>

public class ResourceFileIoAdapter implements IIOAdapter {@Overridepublic InputStream open(String path) throws IOException {ClassPathResource resource = new ClassPathResource(path);// return Files.newInputStream(resource.getFile().toPath());// Linux环境下跑要把open()里改成这样:return resource.getInputStream();}@Overridepublic OutputStream create(String path) throws IOException {ClassPathResource resource = new ClassPathResource(path);OutputStream os = new FileOutputStream(resource.getFile());return os;}
}

 http://nlp.hankcs.com/download.php?file=data
下载后


其中数据分为词典和模型,其中词典是词法分析必需的,模型是句法分析必需的,用户可以自行增删替换,如果不需要句法分析等功能的话,随时可以删除model文件夹 

实践使用

从文本中提取关键字

// 提取名词关键字
public static String extractOptimizedKeywords(String text, int keywordCount) {// 获取短语List<String> termList = HanLP.extractPhrase(text, 100);// 只保留都是名词的短语List<String> termNounsList = filterOnlyNounsFromPhrases(termList);System.out.println(termNounsList);// 计算TF-IDF值并排序Map<String, Double> tfidfMap = calculateTfidf(termNounsList, text);List<Map.Entry<String, Double>> sortedKeywords = tfidfMap.entrySet().stream().sorted(Map.Entry.<String, Double>comparingByValue().reversed()).collect(Collectors.toList());// 返回出现次数最多的前keywordCount个复合关键字List<String> keywords = sortedKeywords.stream().limit(keywordCount).map(Map.Entry::getKey).collect(Collectors.toList());// 将关键词列表转换为逗号分隔的字符串return String.join(", ", keywords);}// 获取名词短语
public static List<String> filterOnlyNounsFromPhrases(List<String> phrases) {List<String> nounOnlyPhrases = new ArrayList<>();for (String phrase : phrases) {// 对每个短语进行分词和词性标注List<Term> terms = HanLP.segment(phrase);// 检查短语中是否所有词都是名词boolean allNouns = terms.stream().allMatch(term -> term.nature.toString().startsWith("n"));// 如果短语中所有词都是名词,则保留该短语if (allNouns) {nounOnlyPhrases.add(phrase);}}return nounOnlyPhrases;}// 计算TF-IDF值并排序
private static Map<String, Double> calculateTfidf(List<String> terms, String corpus) {Map<String, Integer> termFrequency = terms.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(v -> 1)));Map<String, Integer> documentFrequency = calculateDocumentFrequency(corpus);Map<String, Double> tfidf = new HashMap<>();for (Map.Entry<String, Integer> entry : termFrequency.entrySet()) {String term = entry.getKey();int freq = entry.getValue();int df = documentFrequency.getOrDefault(term, 1); // 确保df至少为1,避免log(0)double tf = (double) freq / terms.size();double idf = Math.log((double) 1 + corpus.length() / df); // 调整idf公式,用语料库长度作为文档数量的代理double tfidfValue = tf * idf;tfidf.put(term, tfidfValue);}return tfidf;}private static Map<String, Integer> calculateDocumentFrequency(String corpus) {List<Term> docTerms = HanLP.segment(corpus);return docTerms.stream().filter(term -> term.nature.toString().startsWith("n")) // 使用startsWith("n")匹配任何名词性质.collect(Collectors.groupingBy(term -> term.word, Collectors.summingInt(v -> 1)));}

http://www.lryc.cn/news/522535.html

相关文章:

  • Excel中函数SIGN()的用法
  • 如何将本地电脑上的文件夹设置为和服务器的共享文件夹
  • 智能建筑时代的核心选择——基于SAIL-RK3576核心板的AI边缘计算网关方案
  • 08、如何预防SQL注入
  • 【时时三省】(C语言基础)柔性数组
  • mongodb详解二:基础操作
  • 【数据分享】1929-2024年全球站点的逐月平均气温数据(Shp\Excel\免费获取)
  • 管理口令安全和资源(一)
  • 【Linux】【Vim】vim编辑器的用法
  • Golang Gin系列-3:Gin Framework的项目结构
  • LabVIEW实车四轮轮速信号再现系统
  • 2025.1.16——六、BabySQL 双写绕过|联合注入
  • Spring Boot 下的Swagger 3.0 与 Swagger 2.0 的详细对比
  • 【已解决】git clone报错:Failed to connect to github.com port 443: Timed out
  • Qt 程序 DPI 适配方法归纳
  • AI刷题-小R的随机播放顺序、不同整数的计数问题
  • windows 极速安装 Linux (Ubuntu)-- 无需虚拟机
  • 【影刀_常规任务计划_API调用】
  • 参数校验 Spring Validation框架
  • Spring Boot 基础入门指南
  • doc、pdf转markdown
  • 基于 HTML5 Canvas 制作一个精美的 2048 小游戏--day 1
  • 知识图谱入门(一)
  • springboot项目-基础数据回显
  • LabVIEW实现油浸式变压器自主监测与实时报告
  • K8S 亲和性与反亲和性 深度好文
  • 关于php语言api接口开发的流程
  • 医疗集群系统中基于超融合数据库架构的应用与前景探析
  • 浅谈云计算15 | 存储可靠性技术(RAID)
  • 43.Textbox的数据绑定 C#例子 WPF例子