针对微博的短篇博文,编写的简单分词和匹配算法。相对于一篇文档的复杂分词算法,能够在效率和可用性上得到较好的平衡。
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));
}
}
分享到:
相关推荐
面对海量的信息流,传统信息过滤技术只能通过简单的关键词匹配,错漏百出,准确率极低,发挥的作用只能是杯水车薪。九眼智能过滤系统利用多项自然语言处理专利算法,为信息的智能实时过滤提供了全新的技术解决方案!...
基于知识图谱+flask的KBQA医疗问答系统以neo4j作为存储,本系统知识图谱建模使用的最大向前匹配是一种贪心算法,从句首开始匹配,每次选择最长的词语。由于只需一次遍历,因此在速度上相对较快。 算法相对简单,...
多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google...这是一个相当简单模式匹配算法的搜索,不幸的是,通常此时出现的大部分都是并不需要的结果。
摘 要: 结合灰度相关与区域特征, 文章提出了一种基于灰度相关图像拼接的改进算法。为减少匹配块的计 算量, 首先在选取的特征块上计算灰度平均值和每个像素与平均值的差值, 然后选取一定的阈值来减小图像 的搜索范围,...
相似适用词,语法,句子,词法分析,情感分析,语义分析等相关的相似度计算。 相似度是由一系列算法组成的Java版相似度计算工具包,目标是传播自然...演示去做文本相似性指标关键词匹配(TF-IDF,BM25)浅层语义匹配
这个程序的用处很简单,就是根据一段话,自动匹配到硬盘上最合适的图片。 前提是要求你的图片尽可能多,这里要求图片的名称包含了这个图片的数据,所有的图片存储在 ``` C:\\Users\\Administrator\\Desktop\\...
一、依托于水淼软件独家万能正文识别智能算法,可实现任何网页正文自动提取准确率95%以上。 二、只需输入关键词,就能采集到百度新闻和网页、搜狗新闻和网页、360新闻和网页、谷歌新闻和网页、必应新闻和网页、雅虎...
相关反馈技术是基于内容的图像检索领域中,关系到系统检索效率的一项 关键技术,本文主要研究工作放在基于SVM的相关反馈技术和个性化检索单 ...关键词:基于内容的图像检索,相关反馈,支持向量机,个性化检索
只靠关键词的索引或简单的匹配算法,并不能真正触及到问题的真实意思,使检索结果一般。 问答系统能针对搜索引擎缺陷的改进 问答系统允许用户以自然语言的形式询问或者输入。 问答系统能直接返回答案,提供给用户...
持续更新:系统定期更新知识库和算法模型,保持系统的知识更新和算法优化,提高系统的智能水平和服务质量。 明日知道系统的实现将为用户提供一个便捷、高效的知识查询平台,帮助用户解决问题、获取信息,提升用户的...
在有的CMS系统中,可以为正文指定关键词,但由于并非专门的搜索引擎算法及结构,也只能是杯水车薪、望洋兴叹,如1、并不能进行相关度排序,2、必须手动或者半自动完全关键词,3、同样不支持超长词条搜索,4、搜全率...
为一本书建立关键词的索引“书签” 什么是全文搜索? 在索引中查找关键字的过程,找到关键字在哪些地方出现 全文索引/搜索 Lucene简介 高性能、可扩展的信息检索工具库 为应用程序添加索引/搜索功能 一个典型的应用...
在有的CMS系统中,可以为正文指定关键词,但由于并非专门的搜索引擎算法及结构,也只能是杯水车薪、望洋兴叹,如1、并不能进行相关度排序,2、必须手动或者半自动完全关键词,3、同样不支持超长词条搜索,4、搜全率...
它主要涉及自然语言处理领域的两个经典问题实体识别 (Entity Recognition) 与实体消歧 (Entity Disambiguation),简单地来说,就是要从文档中识别出人名、地名、机构名、电影等命名实体。并且,在不同环境下同一实体...
扰动长度相匹配的扰动幅度的数学表达式,为缩短的发射器的综合设计提供了 理论依据。同时,由于发射器变短,相应地增加了电子回收区的长度,有利于 电子回收系统的设计和避免电子束撞击到发射器的内壁上。此方法通过...
在最初的分类需求中,上家开发人员通过面向数据的编程,通过关键词检测等手段,处理一部分特征明显的工单,随后通过fasttext处理剩余的工单,在当时满足了客户的需求。 基于fasttext的层级文本分类 我们接手派单...
信息筛选,搜索出来的结果不见得能够完全匹配,建议大家多阅读前几页的搜索结果,多打开几个网页看看,不过,我的经验是超过3页一般就没意义了,所以超过3页还没有找到合适的答案,或许应该调整一下关键词,或者放...
匹配指定文本.ec 十六进制 转十进制模块 .ec 十进制转化为十六进制5.ec 压缩加密文件夹.ec 压缩文件夹.ec 双功能自动编号模块.ec 发 送消息_全选插入.ec 取CPU特征字.ec 取DOS执行结果.ec 取DOS执行结果模块 1.0.ec ...