相对于英文检索,中文检索有两个特别要考虑的问题:编码问题和中文分词问题。
一、编码问题
1. 为了解决中文编码问题,我们在网页结构化信息预处理的时候统一采用utf-8编码;
2. 在Lucene创建索引的时候,构造一个BufferedReader对象以utf-8编码读取文件,使用如下语句:
BufferedReader br = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
二、中文分词问题
1. 什么是中文分词?
中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。比如,“我爱计算机”可以分词为“我/爱/计/算/机”,也可以分词为“我/爱/计算机”.
2. 对于搜索引擎,中文分词为什么重要?
对于一个搜索引擎来说,中文分词问题非常重要,体现在以下两个方面:
- 建立索引时:Lucene对纯文本文件进行中文分词,分词的结果是一个一个单独的词元,然后我们对每一个词元(term)建立倒排索引,所以中文分词是建立倒排索引的关键步骤,而分词结果的好坏也直接影响着索引的性能;
- 处理用户查询时:通常来说,用户输入的查询是一句话或一段话,这时,Lucene要对用户输入的查询进行分词处理,与建立索引的过程类似,用户查询会被切分成为一系列的词元(term),检索的过程实际是根据倒排索引对这一系列词元查找其所在文档(当然,最后要对文档排序)。所以中文分词对于处理用户查询也有着重要意义,分词好坏直接影响是否能准确找到用户想要的结果。
由此可见,中文分词对于搜索引擎来说是至关重要的,中文分词的好坏直接决定着索引的性能和检索的准确率,直接影响着搜索引擎的用户体验。
3. 中文分词难在哪里?
我们知道,在英文的行文中,单词之间是以空格作为自然分界符的;而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,比如“我喜欢猕猴桃”可以被分词为“我/喜欢/猕猴桃”,也可以被分词为“我/喜欢/猕猴/桃”,但显然,前者更合理。由此可见,不同于英文分词的以空格无脑划分,中文分词存在歧义,那么中文分词更需要技巧,应该尽可能地与人类的思维相一致,这就对中文分词提出了很高的要求。
4. 如何解决中文分词问题?
事实上,现在已经有很多优秀的开源中文分词器比较好得解决了中文分词问题。比如Lucene本身就自带了SmartChineseAnalyzer分词器来处理中文分词问题,还有庖丁分词器,结巴分词器,IKAnalzer,盘古分词,中科院分词器等等,这些分词器各有优劣,大家可以参考不同中文分词器的比较。有了这些开源的成熟中文分词器,我们就可以在项目中直接应用啦,再深入了解一些,我们可以重载这些分词器,根据需求进行个性化定制,或许深入了解原理后,聪明的你也可以自己写个分词器哦~
在我们的项目简体中文版儿童搜索引擎中,我们使用了IKAnalyzer分词器,以后我们还会讲述这个分词器的具体使用~~