编辑推荐

Java中文文本信息处理(从海量到精准)》以零基础的读者自学完成一个中文分词系统作为目标。从Java基础语法开始,然后到文本处理相关的数据结构和算法,最后实现文本切分和词性标注。《Java中文文本信息处理(从海量到精准)》是少有的介绍业界热门的Java开发中文分词的书籍。《Java中文文本信息处理(从海量到精准)》选取相关领域的经典内容深入理解和挖掘,也综合了实践性强的创新想法。适用于对软件开发感兴趣的青少年或者大学生。

内容简介

  《Java中文文本信息处理(从海量到精准)》以让零基础的读者通过自学完成一个中文分词系统为目标,从Java基础语法开始讲解,然后介绍文本处理相关的数据结构和算法,后介绍如何实现文本切分和词性标注。
  《Java中文文本信息处理(从海量到精准)》是介绍业界热门的以Java开发中文分词技术的书籍。《Java中文文本信息处理(从海量到精准)》选取相关领域的经典内容,深入理解和挖掘,也综合了实践性强的创新想法,适合对软件开发感兴趣的青少年或者大学生阅读和学习。

作者简介

罗刚,计算机软件硕士,毕业于吉林工业大学。2005年创立北京盈智星科技发展有限公司,2008年联合创立上海数聚软件公司。猎兔搜索创始人,当前猎兔搜索在北京和上海以及石家庄均设有研发部。带领猎兔搜索技术开发团队先后开发出猎兔中文分词系统、猎兔文本挖掘系统,智能垂直搜索系统以及网络信息监测系统等,实现互联网信息的采集、过滤、搜索和实时监测,其开发的搜索软件日用户访问量达万次以上。

目录

第1章Java软件开发
1.1背景
1.1.1好身体是一切成功的保证
1.1.2路线图
1.1.3Java
1.2软件工具
1.2.1搜索引擎
1.2.2Windows命令行
1.2.3机器翻译
1.2.4Linux
1.2.5源代码比较工具
1.3Java基础
1.3.1准备开发环境
1.3.2Eclipse
1.4本章小结

第2章结构化程序设计
2.1基本数据类型
2.2变量
2.2.1表达式执行顺序
2.2.2简化的运算符
2.2.3常量
2.3控制结构
2.3.1语句
2.3.2判断条件
2.3.3三元运算符
2.3.4条件判断
2.3.5循环
2.4方法
2.4.1main方法
2.4.2递归调用
2.4.3方法调用栈
2.5数组
2.5.1数组求和
2.5.2计算平均值举例
2.5.3前趋节点数组
2.5.4快速复制
2.5.5循环不变式
2.6字符串
2.6.1字符编码
2.6.2格式化
2.6.3增强switch语句
2.7数值类型
2.7.1类型转换
2.7.2整数运算
2.7.3数值运算
2.7.4位运算
2.8安装Java
2.8.1服务器端安装
2.8.2自动安装Java
2.9提高代码质量
2.9.1代码整洁
2.9.2单元测试
2.9.3调试
2.9.4重构
2.10本章小结

第3章面向对象编程
3.1类和对象
3.1.1类
3.1.2类方法
3.1.3类变量
3.1.4实例变量
3.1.5构造方法
3.1.6对象
3.1.7实例方法
3.1.8调用方法
3.1.9内部类
3.1.10克隆
3.1.11结束
3.2继承
3.2.1重写
3.2.2继承构造方法
3.2.3接口
3.2.4匿名类
3.2.5类的兼容性
3.3封装
3.4重载
3.5静态
3.5.1静态变量
3.5.2静态类
3.5.3修饰类的关键词
3.6枚举类型
3.7集合类
3.7.1动态数组
3.7.2散列表
3.7.3泛型
3.7.4GoogleGuava集合
3.7.5类型擦除
3.7.6遍历
3.7.7排序
3.7.8lambda表达式
3.8比较
3.8.1Comparable接口
3.8.2比较器
3.9SOLID原则
3.10异常
3.10.1断言
3.10.2Java中的异常
3.10.3从方法中抛出异常
3.10.4处理异常
3.10.5正确使用异常
3.11字符串对象
3.11.1字符对象
3.11.2查找字符串
3.11.3修改字符串
3.11.4格式化
3.11.5常量池
3.11.6关于对象不可改变
3.12日期
3.13大数对象
3.14给方法传参数
3.14.1基本类型和对象
3.14.2重载
3.15文件操作
3.15.1文本文件
3.15.2二进制文件
3.15.3文件位置
3.15.4读写Unicode编码的文件
3.15.5文件描述符
3.15.6对象序列化
3.15.7使用IOUtils
3.16Java类库
3.16.1使用Java类库
3.16.2构建JAR包
3.16.3使用Ant
3.16.4生成JavaDoc
3.16.5ClassLoader
3.16.6反射
3.17编程风格
3.17.1命名规范
3.17.2流畅接口
3.17.3日志
3.18IDEA
3.19实例
3.20本章小结

第4章处理文本
4.1字符串操作
4.2有限状态机
4.2.1从NFA到DFA
4.2.2DFA
4.2.3DFA交集
4.2.4DFA并集
4.2.5有限状态转换
4.3本章小结

第5章数据结构
5.1链表
5.2树算法
5.2.1标准Trie树
5.2.2链表Trie树
5.2.3二叉搜索树
5.2.4数组形式的二叉树
5.2.5三叉Trie树
5.2.6三叉Trie树交集
5.2.7Trie树词典
5.2.8平衡Trie树
5.2.9B树
5.3双数组Trie
5.4队列
5.4.1链表实现的队列
5.4.2优先队列
5.4.3找出前k个最大的元素
5.5堆栈
5.6双端队列
5.7散列表
5.7.1快速查找的散列表
5.7.2HashMap
5.7.3应用散列表
5.7.4开放式寻址
5.7.5布隆过滤器
5.7.6SimHash
5.8图
5.8.1表示图
5.8.2遍历图
5.9大数据
5.10本章小结

第6章算法
6.1贪婪法
6.2分治法
6.3动态规划
6.4在中文分词中使用动态规划算法
6.5本章小结

第7章最长匹配分词
7.1正向最大长度匹配法
7.2逆向最大长度匹配法
7.3处理未登录串
7.4开发分词
7.5本章小结

第8章概率语言模型的分词方法
8.1一元模型
8.2整合基于规则的方法
8.3表示切分词图
8.4形成切分词图
8.5数据基础
8.5.1文本形式的词表
8.5.2数据库词表
8.6改进一元模型
8.7二元词典
8.8完全二叉数组
8.9三元词典
8.10N元模型
8.11N元分词
8.12生成语言模型
8.13评估语言模型
8.14概率分词的流程与结构
8.15本章小结

第9章词性标注
9.1数据基础
9.2隐马尔科夫模型
9.3存储数据
9.4统计数据
9.5整合切分与词性标注
9.6知识型词性序列标注
9.7本章小结
参考资源
后记

精彩书摘

第4章处理文本

  网上聊天时,可能会遇到过找错对象的尴尬事情。程序应该可以帮助判断聊天对象是否正确。

  XML和JSON这样的文本格式很流行,因为不仅程序可以读,人也是可以读懂的。这样的文本格式也需要解析。

4.1字符串操作

  经常需要分割字符串。例如IP地址127.0.0.1按.分割。可以先用String类中的indexOf方法来查找子串“.”,然后再截取子串。例如:

  

StringinputIP="127.0.0.1";//本机IP地址

intp=inputIP.indexOf('.');//返回位置3

  

  这里的‘.’在字符串“127.0.0.1”中出现了多次。因为是从头开始找起,所以返回第一次出现的位置3。

  如果没有找到子串,则indexOf返回-1。例如要判断虚拟机是否为64位的:

  

//当在32位虚拟机时,将返回32;而在64位虚拟机时,返回64

Stringx=System.getProperty("sun.arch.data.model");

System.out.println(x);//在32位虚拟机中输出32

System.out.println(x.indexOf("64"));//输出-1

  

  如果找到了,则返回的值不小于0。所以可以这样写:

  

if(x.indexOf("64")<0){

  System.out.println("32位虚拟机");

}

  

  indexOf(Stringstr,intfromIndex)从指定位置开始查找。例如:

  

StringinputIP="127.0.0.1";

System.out.println(inputIP.indexOf('.',4));//输出5,也就是第二个.所在的位置

  

  从字符串inputIP里寻找点“.”的位置,但寻找的时候,要从inputIP的索引为4的位置开始,这就是第二个参数4的作用,由于索引是从0开始的,这样,实际寻找的时候是从字符0开始的,所以输出5,也就是第二个点“.”所在的位置。

  String.subString取得原字符串其中的一段,也就是子串。传入两个参数:开始位置和结束位置。例如:

  

StringinputIP="127.0.0.1";

intp=inputIP.indexOf('.');

intq=inputIP.indexOf('.',p+1);

StringIPsection1=inputIP.substring(0,p);//得到"127"

StringIPsection2=inputIP.substring(p+1,q);//得到"0"

  

  StringTokenizer类专门用来按指定字符分割字符串。StringTokenizer的nextToken()方法取得下一段字符串。

  hasMoreElements()方法判断是否还有字符串可以读出。可以在StringTokenizer的构造方法中指定用来分隔字符串的字符。

  例如分割IP地址:

  

StringinputIP="127.0.0.1";

StringTokenizertoken=

newStringTokenizer(inputIP,".");//用.分割IP地址串

while(token.hasMoreElements()){//有更多的子串

  System.out.print(token.nextToken()+"");//输出下一个子串

}

  

  StringTokenizer默认按空格分割字符串。例如翻译英文句子:

  

HashMapecMap=newHashMap();

ecMap.put("I","我");//放入一个键/值对

ecMap.put("love","爱");

ecMap.put("you","你");

Stringenglish="Iloveyou";

StringTokenizertokenizer=

newStringTokenizer(english);//用空格分割英文句子

while(tokenizer.hasMoreElements()){//有更多的词没遍历完

  System.out.print(ecMap.get(tokenizer.nextToken()));//输出:我爱你

}

  

  StringTokenizer有几个构造方法,其中最复杂的构造方法是:

  

StringTokenizer(Stringstr,Stringdelim,booleanreturnDelims)

  

  如果最后这个参数returnDelims标记是false,则分隔字符只作为分隔词使用,一个返回的词是不包括分隔符号的最长序列。如果最后一个参数标记是true,则返回的词可以是分隔字符。默认是false,也就是不返回分隔字符。

  如果需要把字符串存入二进制文件。可能会用到字符串和字节数组间的互相转换。首先看一下如何从字符串得到字节数组:

  

Stringword="的";

byte[]validBytes=word.getBytes("utf-8");//字符串转换成字节数组

System.out.println(validBytes.length);//输出长度是3

  

  可以直接调用Charset.encode实现字符串转字节数组:

Charsetcharset=Charset.forName("utf-8");//得到字符集

CharBufferdata=CharBuffer.wrap("数据".toCharArray());

ByteBufferbb=charset.encode(data);

System.out.println(bb.limit());//输出数据的实际长度6

  

  Charset.decode把字节数组转回字符串:

  

byte[]validBytes="程序设计".getBytes("utf-8");//字节数组

//对字节数组赋值

Charsetcharset=Charset.forName("utf-8");//得到字符集

//字节数组转换成字符

CharBufferbuffer=charset.decode(ByteBuffer.wrap(validBytes));

System.out.println(buffer);//输出结果

  

前言/序言

前言

  

  “前门到了,请在后门下车。”把“前门”标注成地名就容易理解这句话了。从种地到买菜、买房、养生保健以及投资理财等,都可以用到中文分词等文本信息挖掘技术。

  各行业都在构建越来越复杂的软件系统,很多系统都会用到文本处理技术。但是即使在计算机专业,也有很多人对文本信息处理相关技术不太了解。其实,学习相关技术的门槛并不高。而《Java中文文本信息处理(从海量到精准)》就是为了普及相关开发而做的一次新的尝试,其中也结合了作者自己的研究成果,希望为推动相关应用的发展做出贡献。

  《Java中文文本信息处理(从海量到精准)》借助计算机语言Java实现中文文本信息处理,试图通过恰当的数据结构和算法来应对一些常见的文本处理任务。相关代码可以从清华大学出版社的网站下载。

  《Java中文文本信息处理(从海量到精准)》的第1章到第3章介绍了相关的Java开发基础。第4章介绍处理文本所用到的有限状态机基本概念和具体实现。第5章介绍相关的基础数据结构。第6章到第9章介绍中文分词原理与实现。

  书中的很多内容来源于作者的开发和教学实践。作者的实践经验还体现在相关的其他书中,如《自己动手写搜索引擎》、《自然语言处理原理与技术实现》、《自己动手写网络爬虫》、《使用C#开发搜索引擎》、《解密搜索引擎技术实战》等。相对于作者编写的其他书籍,《Java中文文本信息处理(从海量到精准)》更加注意零基础入门。

  学习是个循序渐进的过程。可以在读者群中共同学习。群体往往比单个人有更多的智慧产出。为了构建出更好的技术群体,请加读者QQ群(453406621)交流。希望快速入门的读者也可以参加相关培训。这《Java中文文本信息处理(从海量到精准)》最开始是为一位从苏州专门来北京现场学习的学员入门中文分词而编写。感谢他为编写《Java中文文本信息处理(从海量到精准)》提供的帮助。

  也希望通过《Java中文文本信息处理(从海量到精准)》能结识更多的同行。有您真诚的建议,我们会发展得更好。例如,通过与同行的交流,让我们的数量、日期等量化信息的提取工具更加成熟。当前,语义分析等文本处理技术仍然需要更深入的发展,来更好地支持各行业的智能软件开发。

  《Java中文文本信息处理(从海量到精准)》由罗刚、张子宪、崔智杰编著,参与《Java中文文本信息处理(从海量到精准)》编写的还有石天盈、张继红、童晓军,在此一并表示感谢。感谢开源软件和我们的家人、关心我们的老师和朋友、创业伙伴,以及选择猎兔自然语言处理软件的客户多年来的支持。

  

  

  

  编者


其他推荐