关于对数据库中多语种数据进行分词索引的问题?
没玩过coreseek或者sphinx,个人目前使用的是solr/lucene,所以一下的功能介绍都是基于solr/lucene的。不过这种全文检索框架,其实对语言的限制不是很大,中文、日文、英文、发文、阿拉伯文其实都没啥区别,因为计算机基本不知道你的语言类型。完整的全文检索分索引和查询两个过程。一、索引就是将非结构化或者半结构化的数据结构化的过程。将网页抓取,数据库查询,文件读入的内容进行一个分词、取无用词(停用词)、词根化、字典排序、建立倒排链表的过程。题主的难点是说日韩文以及sphinx的一元分词。首先说一下分词词典,其实人脑和计算机一样,想要从一句话中提取有意义的词语,都是需要词典库的。例如对于“今年是中华人民共和国成立65周年”这句话,我们人之所以知道“今年”、“人民”、“共和国”等是一个词语,是因为以前我们学到过、接触到过,这个学习接触的过程,其实就是在往你大脑这个词库加入新的分词。那么计算机也是如此,一般的分词算法都建立在一个基本的分词词典文件之上,运行用户扩展自定义。对于楼主所说sphinx是不是只有一元分词,我没用过,不做多说,但我理解的一元分词是不需要分词词典。理解了分词原理之后,其实对于什么语言根本没关系,计算机所做的就是依次扫描。还是上面举的例子,计算机获得的内容是(基于词库的词典树):“今”:词库里有,但是不是词尾,会继续往后“今年”:词库里有,“年”可以是词尾,也就是说“今年”是一个词;如果是最大分词,则继续往后判断“今年是”是否在词典里,不在的话,会往回保留“今年”,否则继续往后。(后面不讨论最大分词)“年”:词库有,不是词尾,继续往后“年是”:词库显示,“年”的子节点木有“是”,则舍弃“年”,从“是”开始“是”:词库有,不是词尾,继续往后“是中”:词库显示,“是”的子节点木有“中”,则舍弃“是”,从“中”开始“中”:词库有,不是词尾,继续往后“中华”:词库显示,“中”的子节点有“华”,且可以是词尾,则保存“中华”,继续往后“中华人”:词库显示,“中”的子节点“华”,他的子节点有“人”,如果“人”可以是这棵词典树的结尾,则保存“中华人”,否则继续“中华人民”:词库显示,“中-华-人”这棵叔的子节点有“民”且可以是词尾,则“中华人民”可以保存。说的不是很清楚,大概的分词核心就是这个。所以,可以把这句话换成其他语言都没关系,重点是分词词典。接下来说说倒排链表,其实倒排链表也是简单,和书本的章节目录差不多。根据目录内容,确定章节具体的页码,只不过全文检索里面可以做到,根据某个词语(分词词典中的),来确定文档编号(系统自增的文档编号),然后通过文档编号来找到当初建立索引的所有信息。所以一个倒排链表就是一个词语,后面跟着所有包含这个词语的文档的文档编号的从小到大的链表。当然这个链表的内容还有很多,比如文档中出现这个词的频率、位置等。二、检索过程简单的来说,就是把用户输入的检索关键字,进行分词,然后分别从倒排链表中拿出每个分词所对应的文档编号链表,接下来就是链表的交集(AND)、差级(NOT)、并集(OR)了。详细的过程就是分词、词根化、同义词处理、建立query树、链表合并、相似度计算(空间向量算法)、综合文档boost进行排序、facet分组统计。说了这么多,不知道能不能帮上题主。其实全文检索领域还是挺有意思的。
■网友
coreseek是基于libmmseg分词器的sfc是xdict吧好像目前sphinx原版对CJK类字体的支持还是挺差的,所以才有上面的这两种专门为了中文而改造和优化的sphinx,非要拿来索引日文、韩文的话,可以先自定义词库看看,是否能有效
推荐阅读
- 过节■江苏省委省政府办公厅下发关于做好2021年元旦春节期间有关工作的通知
- |徐州市出台《关于优化创新创业生态系统 提升区域科技创新活力的实施意见》及实施细则
- 雨下|全球关于禁售燃油车只是理论上可行吗
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 智叔|很多家长还在整箱买:谈谈关于牛奶的17个真相警惕这些列入黑名单的“假牛奶”
- 关于微信小程序的思考:运营者该何去何从
- 关于人工智能虚拟人的一些问题
- 知乎上关于人生经验的介绍是否可能对青少年造成潜在危害
- 考研数据库方向
- 哪个数据库,可以直接做数据透视图(navicat类的也可以)
