分词器实现代码:
package com.zd.tokenizer;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Tokenizer {
private Map<Character, Object> dictionary;

public Tokenizer(String dictionaryFilePath) throws IOException {//红黑树的实现dictionary = new TreeMap<>();//从文件加载字典到TreeMapthis.loadDictionary(dictionaryFilePath);
}private void loadDictionary(String dictionaryFilePath) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(dictionaryFilePath)));String line = null;while ((line = reader.readLine()) != null) {line = line.trim();if (line.length() == 0) {continue;}char c;Map<Character, Object> child = this.dictionary;//组成以这个字符开头的词的树for (int i = 0; i < line.length(); i++) {c = line.charAt(i);Map<Character, Object> ccMap = (Map<Character, Object>) child.get(c);if (ccMap == null) {ccMap = new HashMap<Character, Object>();child.put(c, ccMap);}child = ccMap;}child.put(' ', null);}
}public List<String> participie(String text) {if (text == null) {return null;}text = text.trim();if (text.length() == 0) {return null;}List<String> tokens = new ArrayList<>();char c;for (int i = 0; i < text.length(); ) {StringBuilder token = new StringBuilder();Map<Character, Object> child = this.dictionary;boolean matchToken = false;for (int j = i; j < text.length(); j++) {c = text.charAt(j);Map<Character, Object> ccMap = (Map<Character, Object>) child.get(c);if (ccMap == null) {if (child.containsKey(' ')) {matchToken = true;i = j;}break;} else {token.append(c);child = ccMap;}}//匹配到词if (matchToken) {tokens.add(token.toString());} else {if (child.containsKey(' ')) {//短的也是词,如张三丰,张三tokens.add(token.toString());break;} else {//没有匹配到词,则该字符作为一个词tokens.add("" + text.charAt(i));i++;}}}return tokens;
}public static void main(String[] args) throws IOException {Tokenizer tk = new Tokenizer(Tokenizer.class.getResource("/dictionary.txt").getPath());List<String> tokens = tk.participie("想过离开,以这种方式存在,是因为那些旁白那些姿态那些伤害");for (String s : tokens){System.out.println(s);}
}

}

搜索引擎之分词器学习相关推荐

  1. Lucene.Net3.0.3+盘古分词器学习使用

    一.Lucene.Net介绍 Lucene.net是Lucene的.net移植版本,是一个开源的全文检索引擎开发包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索 ...

  2. 搜索引擎ES--IK分词器

    目录 集成IK分词器 扩展词典使用 停用词典使用 同义词典使用 集成IK分词器 概要:IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包.新版本的IKAnalyzer3.0 ...

  3. Lucene初学——3. 分词器学习

    1.demo public class AnalyzerStudy {private static String str = "分词器测试 Lucene 案例 开发 by future fo ...

  4. springboot elasticsearch vue ik中文分词器 实现百度/京东全文搜索

    背景:实现和百度搜索一样效果的,全文搜索引擎支持关键词高亮显示 文章目录 1. 企业级搜索引擎解决方案 2. 创建索引规则 3. 数据拉取 4. 搜索高亮 5. 自定义词库 6. 效果图 7. 开源源 ...

  5. 搜索引擎学习(四)中文分词器

    一.简介 分词原理 Reader读取数据流 数据经过第一个分词器将大写转换小写 数据经过第二个分词器根据空格分割成一个一个的单词 数据经过第三个分词器把标点符号,介词等剔除 经过三次过滤,生成若干语汇 ...

  6. 数据库-Elasticsearch进阶学习笔记(分片、映射、分词器、即时搜索、全文搜索等)

    目录 基础概念 定义 特点 索引(Index) 分片(Shards) 副本(Replicas) 分配(Allocation) 映射(Mapping) 动态映射 显式映射 常见数据类型 文档(docum ...

  7. 学习 ES 的笔记、全文检索、倒排索引、Lucene、ik中文分词器、Kibana使用Dev Tools

    文章目录 感悟 新接触的单词 知识点一:ES是什么? 知识点二:ES基本概念 知识点三:1.1 什么是全文检索和Lucene? 知识点四:1.2 什么是倒排索引,Lucene实现全文检索的流程是怎样? ...

  8. Elasticsearch——分布式搜索引擎01(索引库、文档、RestAPI、RestClient、拼音分词器、IK分词器)

    Elasticsearch--分布式搜索引擎01(索引库.文档.RestAPI.RestClient.拼音分词器.IK分词器) 一.初识 elesticsearch 1.1 简介 1.2 倒排索引(重 ...

  9. 搜索引擎——反向索引原理揭秘及手写ik分词器

    原创不易,转载请标明地址,或者直接附上我的博客首页https://georgedage.blog.csdn.net/ 上篇博客我们说到,数据库为什么不适合搜索引擎的底层存储?,那么什么适合呢? ela ...

最新文章

  1. CALayer 知识:创建带阴影效果的圆角图片图层和创建自定义绘画内容图层
  2. 四旋翼建模与开源飞控算法(草稿,待整理)
  3. Linux下程序包管理工具RPM
  4. 一文看懂Python的控制结构:for、while、if…都有了
  5. iOS探索:Block解析浅谈
  6. ntp协议中 服务器失效怎么办,排除网络时间协议(NTP)故障
  7. gtest 学习之五 测试用例中定义类
  8. 微分方程的数值解法与程序实现 pdf_数值计算方法·第三部分
  9. Ubuntu修改键盘布局
  10. leetcode加一
  11. 如何设计三极管控制继电器电路
  12. python小程序嵌入excel_用原生的方式操作Excel,Python玩转Excel神器xlsxwriter详解!...
  13. C#生成条形码图片的简单方法
  14. direct wifi 投屏_【教程】Microsoft Wi-Fi Direct Virtual关闭方法
  15. 识图在线识图_性感AI,在线赋能小程序
  16. 使用WMI provider创建进程
  17. 与门或门非门是计算机语言吗,VHDL实现与门,或门,非门。
  18. 【极海APM32替代笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)
  19. 如何选择靠谱的区块链技术服务商?佰忆科技有秘籍
  20. 模块VME-7807RC-410000 350-930078074-410000可编程控制器 VMEPFOFIVERS3.40990901 VMI/VME7697 VMIACC5595208

热门文章

  1. XMODEM设计与C代码实现(1.整体设计篇)
  2. 驱动保护:挂接SSDT内核钩子(1)
  3. 斐波那契数列时间复杂度Logn的算法
  4. 【Error】监听dblclick双击事件不起作用
  5. 【HMS Core】【FAQ】【Health Kit】运动健康服务常见错误码合集 403、401、1001、20023
  6. pyinstall install
  7. 行业认可 | 悬镜安全荣膺DevSecOps创新赛道领航者,获选年度创新力十强
  8. 网页播放技术的歌词同步
  9. IPSEC服务器配置
  10. 军犬舆情每日热点:抢票软件被中铁总局限制;中石化2018净利624亿