`
kirayuan
  • 浏览: 38708 次
文章分类
社区版块
存档分类
最新评论

简单关键词匹配算法

 
阅读更多

针对微博的短篇博文,编写的简单分词和匹配算法。相对于一篇文档的复杂分词算法,能够在效率和可用性上得到较好的平衡。


package com.sina.tblog.sentiment;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Pattern;

import com.sina.tblog.sentiment.constant.Constant;

public class KeyWordFilter {
	
	public static HashSet<String> KeyWordsList = null;
	public static HashSet<String> letterKeyWordsList = null;
	
	/**
	 * 初始化或重新导入关键词列表
	 * @throws IOException
	 */
	static{
		try {
			initKeyWords(Constant.KeyWordsFiles);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

	
	public static int deleteNewWord(String word){
		if(word.length()>10||word.length()<2)
			return -1;
		
		if(!KeyWordsList.contains(word))
			return 0;
		KeyWordsList.remove(word);
		if(Pattern.compile("(?i)[a-z][A-Z]").matcher(word).find())  
			letterKeyWordsList.remove(word.toUpperCase());
		FileOutputStream stream; 
		OutputStreamWriter writer;

		try {
			stream = new FileOutputStream(Constant.newWordsFile,true);
			
			writer = new OutputStreamWriter(stream);
			writer.write("\n"+word);
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return -1;
		}
		return 1;
		
	}
	
	public static int addWord(String word){
		if(word.length()>10)
			return -1;
		
		if(KeyWordsList.contains(word))
			return 0;
		KeyWordsList.add(word);
		if(Pattern.compile("(?i)[a-z][A-Z]").matcher(word).find())  
			letterKeyWordsList.add(word.toUpperCase());
		FileOutputStream stream; 
		OutputStreamWriter writer;

		try {
			stream = new FileOutputStream(Constant.newWordsFile,true);
			writer = new OutputStreamWriter(stream);
			writer.write("\n"+word);
			writer.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return -1;
		}
		return 1;
		
	}
	
	private static void initKeyWords(String Files[]) throws IOException {
		
		if(KeyWordsList!=null)
			KeyWordsList.clear();
		else
			KeyWordsList = new HashSet<String>();
		
		if(letterKeyWordsList!=null)
			letterKeyWordsList.clear();
		else
			letterKeyWordsList = new HashSet<String>();
			
		for(int i=0;i<Files.length;i++){
				
				File file = new File(Files[i]);
				BufferedReader reader = null;
				reader = new BufferedReader(new FileReader(file));
				String tmp = reader.readLine();
				while(tmp!=null){
					KeyWordsList.add(tmp);
					if(Pattern.compile("(?i)[a-z][A-Z]").matcher(tmp).find())  
						letterKeyWordsList.add(tmp.toUpperCase());
					tmp = reader.readLine();
				}
				reader.close();
		}
	}
	
	private static boolean findWord(String str,boolean ignoreCase){
		
		
			if(ignoreCase == false)
				return KeyWordsList.contains(str);
			else{
				boolean match = KeyWordsList.contains(str);
				if(match == false){
					match = letterKeyWordsList.contains(str.toUpperCase());
				}
				return match;
			}
			
	}
	
	public static List<String> segmentStrQuickMatch( String str_line,boolean ignoreCase)
	{
		String term = "";
		boolean term_tag = false;
		int str_size=0,left=0,len=0;
		List<String> list = new ArrayList<String>();
		
		str_size = str_line.length();
		
		while(left<str_size)
		{
			len = Constant.max_len;
		
			while( len>=Constant.min_len )			//gkm:每一词
			{
				term="";
				int right = left+len;
				
				int x = 0;
				if(right>str_size){
					x = right-str_size;
					right = str_size;
				}
				
				term=str_line.substring(left,right);
				
					term_tag=findWord(term,ignoreCase);

				if(term_tag==true)
					break;
				if(x>0)
					len-=x+1;
				else
					len-=1;
			}
			if(term_tag==false)		//gkm:词典中没有term,后移一个字符(以一个字符的速度后移,使得可以分出中英混合的词,没有判断无效字符,有待改进!!! )
			{
				left+=1;
			}
			else					//gkm:词典中有term,后移len个字符,term加入到terms_vct[term_tag]
			{
				left+=len;
				
				list.add(term);
			}
			
		}//while(left<str_size)
		return list;
	}
	
	public static List<String> segmentStrFullMatch( String str_line,boolean ignoreCase)
	{
		String term = "";
		boolean term_tag = false;
		int str_size=0,left=0,len=0;
		List<String> list = new ArrayList<String>();
		
		str_size = str_line.length();
		
		while(left<str_size)
		{
			len = Constant.max_len;
			
			while( len>=Constant.min_len )			//gkm:每一词
			{
				term="";
				int right = left+len;
				
				int x = 0;
				if(right>str_size){
					x = right-str_size;
					right = str_size;
				}
				
				term=str_line.substring(left,right);

				term_tag=findWord(term,ignoreCase);

				if(term_tag==true)
					list.add(term);
				
				if(x>0)
					len-=x+1;
				else
					len-=1;
				
			}
				left+=1;
			
		}//while(left<str_size)
		return list;
	}
	
	
	
	public static void main(String[] args) throws IOException {
		System.out.println(segmentStrFullMatch("中华人民共和国",true));
	}
		
}


分享到:
评论

相关推荐

    九眼智能过滤系统共享版(信息过滤软件)v1.0最新中文绿色版版

    面对海量的信息流,传统信息过滤技术只能通过简单的关键词匹配,错漏百出,准确率极低,发挥的作用只能是杯水车薪。九眼智能过滤系统利用多项自然语言处理专利算法,为信息的智能实时过滤提供了全新的技术解决方案!...

    毕业设计-基于Python知识图谱的大数据医学知识领域问答系统(源码+数据库+安装教程)

    基于知识图谱+flask的KBQA医疗问答系统以neo4j作为存储,本系统知识图谱建模使用的最大向前匹配是一种贪心算法,从句首开始匹配,每次选择最长的词语。由于只需一次遍历,因此在速度上相对较快。 算法相对简单,...

    十大高明的Google搜索技巧

    多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google...这是一个相当简单模式匹配算法的搜索,不幸的是,通常此时出现的大部分都是并不需要的结果。

    数学建模--碎片拼接

    摘 要: 结合灰度相关与区域特征, 文章提出了一种基于灰度相关图像拼接的改进算法。为减少匹配块的计 算量, 首先在选取的特征块上计算灰度平均值和每个像素与平均值的差值, 然后选取一定的阈值来减小图像 的搜索范围,...

    相似度:相似度:相似度计算工具包,java编写。用于词,短语,句子,词法分析,情感分析,语义分析等相关的相似度计算

    相似适用词,语法,句子,词法分析,情感分析,语义分析等相关的相似度计算。 相似度是由一系列算法组成的Java版相似度计算工具包,目标是传播自然...演示去做文本相似性指标关键词匹配(TF-IDF,BM25)浅层语义匹配

    python建立图片索引数据库,根据一段文字,找到存放在电脑上最匹配的图片

    这个程序的用处很简单,就是根据一段话,自动匹配到硬盘上最合适的图片。 前提是要求你的图片尽可能多,这里要求图片的名称包含了这个图片的数据,所有的图片存储在 ``` C:\\Users\\Administrator\\Desktop\\...

    水淼·万能文章采集器v2.17.7.0破解版

    一、依托于水淼软件独家万能正文识别智能算法,可实现任何网页正文自动提取准确率95%以上。 二、只需输入关键词,就能采集到百度新闻和网页、搜狗新闻和网页、360新闻和网页、谷歌新闻和网页、必应新闻和网页、雅虎...

    基于内容的图像检索中相关反馈技术的研究及系统实现

    相关反馈技术是基于内容的图像检索领域中,关系到系统检索效率的一项 关键技术,本文主要研究工作放在基于SVM的相关反馈技术和个性化检索单 ...关键词:基于内容的图像检索,相关反馈,支持向量机,个性化检索

    智能问答系统调研.docx

    只靠关键词的索引或简单的匹配算法,并不能真正触及到问题的真实意思,使检索结果一般。 问答系统能针对搜索引擎缺陷的改进 问答系统允许用户以自然语言的形式询问或者输入。 问答系统能直接返回答案,提供给用户...

    java源码之明日知道系统的实现.zip

    持续更新:系统定期更新知识库和算法模型,保持系统的知识更新和算法优化,提高系统的智能水平和服务质量。 明日知道系统的实现将为用户提供一个便捷、高效的知识查询平台,帮助用户解决问题、获取信息,提升用户的...

    易搜索 站内全文检索搜索引擎 v1.0.rar

    在有的CMS系统中,可以为正文指定关键词,但由于并非专门的搜索引擎算法及结构,也只能是杯水车薪、望洋兴叹,如1、并不能进行相关度排序,2、必须手动或者半自动完全关键词,3、同样不支持超长词条搜索,4、搜全率...

    基于lucene的搜索引擎总结

    为一本书建立关键词的索引“书签” 什么是全文搜索? 在索引中查找关键字的过程,找到关键字在哪些地方出现 全文索引/搜索 Lucene简介 高性能、可扩展的信息检索工具库 为应用程序添加索引/搜索功能 一个典型的应用...

    易搜索站内全文检索搜索引擎

    在有的CMS系统中,可以为正文指定关键词,但由于并非专门的搜索引擎算法及结构,也只能是杯水车薪、望洋兴叹,如1、并不能进行相关度排序,2、必须手动或者半自动完全关键词,3、同样不支持超长词条搜索,4、搜全率...

    基于自动生成知识库的智能问答系统python源码+项目说明+数据+超详细注释.tar

    它主要涉及自然语言处理领域的两个经典问题实体识别 (Entity Recognition) 与实体消歧 (Entity Disambiguation),简单地来说,就是要从文档中识别出人名、地名、机构名、电影等命名实体。并且,在不同环境下同一实体...

    同轴腔回旋管准光学模式转换器(博士论文)

    扰动长度相匹配的扰动幅度的数学表达式,为缩短的发射器的综合设计提供了 理论依据。同时,由于发射器变短,相应地增加了电子回收区的长度,有利于 电子回收系统的设计和避免电子束撞击到发射器的内壁上。此方法通过...

    基于python+Flask+Paddle-ERNIE实现的的自动派单系统源码+项目说明.zip

    在最初的分类需求中,上家开发人员通过面向数据的编程,通过关键词检测等手段,处理一部分特征明显的工单,随后通过fasttext处理剩余的工单,在当时满足了客户的需求。 基于fasttext的层级文本分类 我们接手派单...

    JAVA自学之路

    信息筛选,搜索出来的结果不见得能够完全匹配,建议大家多阅读前几页的搜索结果,多打开几个网页看看,不过,我的经验是超过3页一般就没意义了,所以超过3页还没有找到合适的答案,或许应该调整一下关键词,或者放...

    1345个易语言模块

    匹配指定文本.ec 十六进制 转十进制模块 .ec 十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 发 送消息_全选插入.ec 取CPU特征字.ec 取DOS执行结果.ec 取DOS执行结果模块 1.0.ec ...

Global site tag (gtag.js) - Google Analytics