java字典树(Trie)实现中文模糊匹配

原理解释:
java实现:https://blog.csdn.net/yuhk231/article/details/51539840
c实现:https://blog.csdn.net/qq_31175231/article/details/77827324
代码模板:缺点,只能检索出在一个分支中的前缀匹配内容

package com.xq.algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;/** 无数据结构设计下的蛮力中文键树*/
class TrieNode {public String value;public ArrayList<TrieNode> ptr = null;public TrieNode(String value) {this.value=value;ptr =new ArrayList<TrieNode>();}
}public class TrieTree_1 {private static TrieNode root = null;ArrayList<String> searchResult=new ArrayList<String>();StringBuffer tempWord=new StringBuffer();int start=0;public TrieTree_1() {root = new TrieNode(null);}public void insert(String key) {TrieNode p = root;String tempWord;boolean contains;TrieNode tempNode;for (int i = 0; i < key.length(); i++) {tempWord=String.valueOf(key.charAt(i));contains=false;for(TrieNode tn:p.ptr){if(tn.value.equals(tempWord)){p=tn;contains=true;break;}}if(!contains){tempNode=new TrieNode(tempWord);p.ptr.add(tempNode);p=tempNode;}}}public ArrayList<String> search(String key) {  //模糊查询就是这个方法,打个比方比如key是"ap",那么ArrayList里就有{"apple","application"}TrieNode p = root;String temp;boolean contains=false;for (int i = 0; i < key.length(); i++) {temp=String.valueOf(key.charAt(i));contains=false;for(TrieNode tn:p.ptr){if(tn.value.equals(temp)){p=tn;contains=true;break;}}if(contains){continue;}else{break;}}if(contains){if(!(p.ptr.isEmpty())){//查找到关键字searchResult.clear();tempWord.delete(0, tempWord.length());tempWord.append(key);start=key.length();traverseTree(p);}else{//已经查找到键树的底部return null;}}else{//没有查找到相应关键字return null;}return searchResult;}private void traverseTree(TrieNode p){if(!(p.ptr.isEmpty())){for(TrieNode tn:p.ptr){tempWord.append(tn.value);start++;traverseTree(tn);start--;tempWord.delete(start,tempWord.length());}}else{searchResult.add(tempWord.toString());}}public static void main(String[] args) {TrieTree_1 chinese = new TrieTree_1();chinese.insert("中");chinese.insert("中国人");chinese.insert("中国");chinese.insert("中华人民");chinese.insert("中华人崛起");chinese.insert("中华上下五千年");ArrayList<String> list = chinese.search("中华");for (String string : list) {System.out.println(string);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word2vec加TextRank算法生成文章摘要

依赖包&#xff1a;https://download.csdn.net/download/dreamzuora/10853874 代码&#xff1a; String document "算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行…

hanlp中文分词、提取摘要关键字、语句分析、智能推荐

hanlp资源&#xff1a; hanlp介绍&#xff1a;http://hanlp.linrunsoft.com/ hanlp下载&#xff1a;https://github.com/hankcs/HanLP hanlp(分词)使用&#xff1a;https://blog.csdn.net/nima1994/article/details/72819973 hanlp1.7:https://github.com/hankcs/HanLP/tree/v1…

TextRank、BM25算法提取关键字、文章自动摘要优秀文章保存

转载地址&#xff1a;http://www.hankcs.com/nlp/textrank-algorithm-java-implementation-of-automatic-abstract.html

set 用法

Set常用用法 2013-04-22 19:24 86508人阅读 评论(1) 收藏 举报分类&#xff1a;CPlus&#xff08;54&#xff09; set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置…

去掉标点符号

//去掉标点符号、空格title title.replaceAll("[\\pP\\p{Punct}| ]", "");

C语言向文件写入内容并读取显示

将学生信息&#xff08;姓名、年龄、学号和平均分&#xff09;写入文件&#xff0c;然后读取显示出来。要求&#xff1a;从控制台输入学生信息&#xff1b;可以输入任意数目的学生信息&#xff1b;文件每行存储一条学生信息&#xff0c;姓名、年龄、学号、平均分以tab(\t)为分隔…

C语言main()主函数执行完毕后是否会再执行一段代码

C语言main()主函数执行完毕后是否会再执行一段代码 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网main() 主函数执行完毕后&#xff0c;是否可能会再执行一段代码&#xff1f;给出说明。main主函数是所有程序必须具备的函数&#xff0c;是C/C人员一接触代码就知道的函数…

java 操作redis

//连接redis &#xff0c;redis的默认端口是6379Jedis jedis new Jedis ("localhost",6379); //验证密码&#xff0c;如果没有设置密码这段代码省略jedis.auth("password"); jedis.connect();//连接jedis.disconnect();//断开连接Set<String> keys…

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

C语言用递归求斐波那契数&#xff0c;让你发现递归的缺陷和效率瓶颈 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网递归是一种强有力的技巧&#xff0c;但和其他技巧一样&#xff0c;它也可能被误用。一般需要递归解决的问题有两个特点&#xff1a;存在限制条件&#xf…

【转载保存】java四种线程池的使用

https://blog.csdn.net/qq_31441667/article/details/78830395

size_t strtok

C语言字符串长度统计函数strlen()的实现原理 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网C标准库中有一个字符串长度统计函数strlen()&#xff0c;用来统计字符串的长度&#xff0c;它的实现与下面类似。 复制纯文本复制 #include <stdlib.h>size_t strlen( cha…

【保存】maven的pom.xml标签的xsi:schemaLocation处报错

maven装X的原因是 maven对下载不下来的jar文件会生成一个 *.lastUpdated 文件 &#xff0c;不将*.lastUpdated文件干掉&#xff0c;它是不会给你重新下载jar, so 将 *.lastUpdated 这个家伙干掉&#xff0c;再update一下就OK了 原文&#xff1a;https://blog.csdn.net/…

strlen() Bug

C语言strlen()以NUL作为字符串结束标记&#xff0c;自定义一个字符串长度统计函数消除这个Bug 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网我们知道&#xff0c;字符串长度统计函数 strlen() 以NUL作为字符串结束标记&#xff0c;但是很不幸的是&#xff0c;有时候字符…

C语言中文件的读取和写入

C语言中文件的读取和写入 注意&#xff1a; 1、由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2、电脑处理文本型和二进制型的不同 &#xff08;因为电脑只认识二进制格式&#xff09; 在C语言中写文件 //获取文件指针 FILE *pFile fopen("1.txt", //打开文件…

基于ansj_seg和nlp-lang的简单nlp工具类

1、首先在pom中引入ansj_seg和nlp-lang的依赖包&#xff0c; ansj_seg包的作用&#xff1a; 这是一个基于n-GramCRFHMM的中文分词的java实现&#xff1b; 分词速度达到每秒钟大约200万字左右&#xff08;mac air下测试&#xff09;&#xff0c;准确率能达到96%以上; 目前实现了…

ArrayList的四种初始化方法

转载&#xff1a;https://beginnersbook.com/2013/12/how-to-initialize-an-arraylist/ Method 1: Initialization using Arrays.asList Syntax: ArrayList<Type> obj new ArrayList<Type>(Arrays.asList(Object o1, Object o2, Object o3, ....so on)); Exam…

C++ Deque(双向队列

C Deque(双向队列)C Deque(双向队列) 是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问&#xff0c;但它不像vector 把所有的对象保存在一块连续的内存块&#xff0c;而是采用多个连续的存储块&#xff0c;并且在一个映射结构中保存…

java.lang.IllegalArgumentException: URLDecoder异常解决

异常&#xff1a; Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9" at java.net.URLDecoder.decode(URLDecoder.java:194) at com.hbzx.co…

STL迭代器

STL迭代器及总结解释迭代器是一种对象&#xff0c;它能够用来遍历STL容器中的部分或全部元素&#xff0c;每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口&#xff0c;所谓迭代器是一种概念上的抽象&#xff1a;那些行为上象迭代器的东西都可以叫做迭代器。…