基于词典的逆向最大匹配中文分词算法,能实现中英文数字混合分词。比如能分出这样的词:bb霜、3室、乐phone、touch4、mp3、T恤。实际分词效果比正向分词效果好

publicclass RMM
{
privatestaticfinal Log log = LogFactory.getLog(RMM.class);

privatestatic HashMap<String, Integer> dictionary =null;
privatestaticfinalint WORD_MAX_LENGTH =9;

static
{
loadDictionary();
}

//将句子切分出词,逆向最大匹配
publicstatic ArrayList<Token> getToken(ArrayList<Sentence> list) throws IOException
{
Collections.reverse(list);
ArrayList<Token> tokenlist=new ArrayList<Token>();
for(Sentence sen:list)
{
StringBuffer word =new StringBuffer();
int offset=sen.getStartOffset()+sen.getText().length;
int bufferIndex = sen.getText().length-1;
char c;
boolean b=false;
while(bufferIndex>-1)
{
offset--;
c=sen.getText()[bufferIndex--];
if(word.length()==0)
word.append(c);
else
{
String temp = (c+word.toString()).intern();
if(dictionary.containsKey(temp) && dictionary.get(temp)==1)
word.insert(0, c);
elseif(dictionary.containsKey(temp) && bufferIndex>-1)
word.insert(0, c);
else
{
bufferIndex++;
offset++;
while(word.length()>1&& dictionary.get(word.toString())!=null&& dictionary.get(word.toString())==2)
{
word.deleteCharAt(0);
bufferIndex++;
offset++;
}
b=true;
}
}
if(b || bufferIndex==-1)
{
Token token =new Token(word.toString(),offset,offset+word.length(),"word");
word.setLength(0);
tokenlist.add(token);
b=false;
}
}
}
Collections.reverse(tokenlist);
return tokenlist;
}

//加载词典
publicstaticvoid loadDictionary()
{
if (dictionary ==null)
{
dictionary =new HashMap<String, Integer>();
InputStream is =null;
BufferedReader br =null;
try
{
is =new FileInputStream(new File(RMM.class.getClassLoader().getResource("dictionary.txt").toURI()));
br =new BufferedReader(new InputStreamReader(is, "UTF-8"));
String word =null;
while ((word = br.readLine()) !=null)
{
word=word.toLowerCase();
if ((word.indexOf("#") ==-1) && (word.length() <= WORD_MAX_LENGTH))
{
dictionary.put(word.intern(), 1);
int i =1;
while(i < word.length()-1)
{
String temp = word.substring(i,word.length()).intern();
if (!dictionary.containsKey(temp))
dictionary.put(temp,2);
i++;
}
}
}
}
catch (Exception e)
{
log.info(e);
}
finally
{
try
{
if(br!=null)
br.close();
if(is!=null)
is.close();
}
catch (IOException e)
{
log.info(e);
}
}
}
}

publicstatic String[] segWords(Reader reader)
{
ArrayList<String> list=new ArrayList<String>();
try
{
ArrayList<Token> tlist= Util.getNewToken(getToken(Util.getSentence(reader)));
for(Token t:tlist)
{
list.add(t.getWord());
}
}
catch(IOException e)
{
log.info(e);
}
return (String[])list.toArray(new String[0]);
}

publicstaticvoid main(String[] args)
{
String[] cc=RMM.segWords(new StringReader("急、急、急、花里林居,二房二厅,业主诚心,出租".toLowerCase()));
for(String c:cc)
{
System.out.println(c);
}
}
}

public class Util
{
//切分出由中文、字母、数字组成的句子
public static ArrayList<Sentence> getSentence(Reader reader) throws IOException
{
ArrayList<Sentence> list=new ArrayList<Sentence>();
StringBuffer cb=new StringBuffer();
int d=reader.read();
int offset=0;
boolean b=false;
while(d>-1)
{
int type=Character.getType(d);
if(type==2 || type==9 || type==5)
{
d=toAscii(d);
cb.append((char)d);
}
else
{
b=true;
}
d=reader.read();
if(d==-1 || b)
{
if(d==-1) offset++;
b=false;
char[] ioBuffer = new char[cb.length()];
cb.getChars(0, cb.length(), ioBuffer, 0);
Sentence sen=new Sentence(ioBuffer,offset-cb.length());
list.add(sen);
cb.setLength(0);
}
offset++;
}
return list;
}

//将相连的单个英文或数字组合成词
public static ArrayList<Token> getNewToken(ArrayList<Token> list) throws IOException
{
ArrayList<Token> tokenlist=new ArrayList<Token>();
Token word=null;
for(int i=0;i<list.size();i++)
{
Token t=list.get(i);
if(t.getWord().length()==1 && Character.getType((int)t.getWord().charAt(0))!=5)
{
if(word==null)
word=t;
else if(word.getEnd()==t.getStart())
{
word.setEnd(t.getEnd());
word.setWord(word.getWord()+t.getWord());
}
else
{
tokenlist.add(word);
word=t;
}
}
else if(word!=null)
{
tokenlist.add(word);
word=null;
tokenlist.add(t);
}
else
tokenlist.add(t);
}
if(word!=null)
tokenlist.add(word);
return tokenlist;
}

//双角转单角
public static int toAscii(int codePoint)
{
if((codePoint>=65296 && codePoint<=65305) //0-9
|| (codePoint>=65313 && codePoint<=65338) //A-Z
|| (codePoint>=65345 && codePoint<=65370) //a-z
)
{
codePoint -= 65248;
}
return codePoint;
}
}

转载于:https://www.cnblogs.com/ibook360/archive/2011/11/11/2245871.html

基于词典的逆向最大匹配中文分词算法,更好实现中英文数字混合分词相关推荐

  1. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词

    基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤 第一次写中文分词程序,欢迎拍砖. publicclass MM ...

  2. PHP基于字典的中英文数字混合分词算法RMM简易实现

    <?phpclass Seg {//字典private $dict = [];//加载字典function set_dict($vDict){//词典大写,方便比对foreach ($vDict ...

  3. python双向最大匹配算法_中文分词算法 之 基于词典的逆向最大匹配算法

    在之前的博文中介绍了基于词典的正向最大匹配算法,用了不到50行代码就实现了,然后分析了词典查找算法的时空复杂性,最后使用前缀树来实现词典查找算法,并做了3次优化. 下面我们看看基于词典的逆向最大匹配算 ...

  4. java中文分词算法_Java实现逆向最大匹配中文分词算法

    写道 //Java实现逆向最大匹配中文分词算法 public class SplitChineseCharacter { public static void main(String[] args) ...

  5. 【摘抄】百度分词算法详解:查询处理以及分词技术

    随着搜索经济的崛起,人们开始越加关注全球各大搜索引擎的性能.技术和日流量.作为企业,会根据搜索引擎的知名度以及日流量来选择是否要投放广告等:作为 普通网民,会根据搜索引擎的性能和技术来选择自己喜欢的引 ...

  6. 搭建基于飞桨的OCR工具库,总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别的PaddleOCR

    介绍 基于飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别.竖排文本识别.长文本识别.同时支持多种文本检测.文本识别的训练算法. 相关链接 PaddleOCR ...

  7. 基于N-gram的双向最大匹配中文分词

    • 摘要 这次实验的内容是中文分词.将一个句子的所有词用空格隔开,将一个字串转换为一个词序列. 而我们用到的分词算法是基于字符串的分词方法中的正向最大匹配算法和逆向最大匹配算法.然后对两个方向匹配得出 ...

  8. 基于词典的前缀扫描中文分词

    说明 中文分词是很多文本分析的基础.最近一个项目,输入一个地址,需要识别出地址中包含的省市区街道等单词.与以往的分词技术不同.jieba/hanlp等常用的分词技术,除了基于词典,还有基于隐马尔科夫/ ...

  9. 列举:中文分词算法你知道几种?

    列举:中文分词算法你知道几种? 摘要:看似普通的一句话,甚至几个词,在机器眼里都要经过好几道"程序".这个过程主要靠中文分词算法,这个算法分为三大类:机械分词算法.基于n元语法的分 ...

最新文章

  1. 【组队学习】【28期】Datawhale组队学习内容介绍
  2. 构建一个业务连续的网络
  3. django模板过滤器
  4. 黑箱优化:大规模语言模型的一种落地方式
  5. 数据挖掘:数据仓库相关知识笔记
  6. 论文阅读 - Beat Tracking by Dynamic Programming
  7. Android系统架构图
  8. 小米登录协议分析_性能测试篇之Loadrunner与ida工具结合完成java vuser协议的脚本...
  9. leetcode python3 简单题67. Add Binary
  10. java中div的用法,Java Math floorDiv()用法及代码示例
  11. 端口状态 LISTENING、ESTABLISHED、TIME_WAIT、FIN_WAIT_2、CLOSE_WAIT、CLOSE_WAIT
  12. word上怎么把图片拼接到一起_图片合并,WORD如何将文字与图片合并
  13. makefile 编写
  14. 鹏业安装算量复制工程量
  15. 程序员需要学会宏观看待问题
  16. 美国四大科技巨头:苹果、微软、Facebook、谷歌的爱恨情仇
  17. 浅谈简单快捷的服务器——私有云服务器!
  18. 笔记本换硬盘装系统完整教程(简单)
  19. ES8新增的常用语法
  20. 关于前端导出文件打不开的问题

热门文章

  1. hdu1074 状态压缩dp+记录方案
  2. 【ijkplayer】编译 Android 版本的 ijkplayer ② ( 切换到 k0.8.8 分支 | 执行 init-android.sh 脚本进行初始化操作 )
  3. 【Android 逆向】Android 系统文件分析 ( 外部存储设备文件 | sbin 命令程序目录 | dev 字符设备目录 )
  4. 【Android 逆向】Android 系统文件分析 ( cpuinfo 处理器信息文件 | self 当前进程信息文件 | meminfo 当前内存信息文件 )
  5. 关于manacher
  6. Docker - command in docker container
  7. android开发之当设置textview多少字后以省略号显示。限制TextView的字数
  8. R语言学习笔记-机器学习1-3章
  9. Bitmap类getPixels()方法中参数stride理解
  10. iOS 6编程-使用Photo Library(照片库)和相机