CN102651026B - 通过预计算优化搜索引擎分词的方法及搜索引擎分词装置 - Google Patents
通过预计算优化搜索引擎分词的方法及搜索引擎分词装置 Download PDFInfo
- Publication number
- CN102651026B CN102651026B CN201210096557.0A CN201210096557A CN102651026B CN 102651026 B CN102651026 B CN 102651026B CN 201210096557 A CN201210096557 A CN 201210096557A CN 102651026 B CN102651026 B CN 102651026B
- Authority
- CN
- China
- Prior art keywords
- array
- character
- sequence code
- trie tree
- search engine
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Character Discrimination (AREA)
Abstract
本发明提出一种通过预计算优化搜索引擎分词的方法,包括以下步骤:按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对所述Trie树子节点的数目多的字符优先进行编码;根据所述序列码进行预计算以生成双数组Trie树的第一数组和第二数组;根据所述序列码、所述第一数组和所述第二数组在所述分词词典中进行分词查询。本发明提高了搜索引擎分词的空间利用率,加快了分词模块的载入速度,增强了线上服务的稳定性。本发明还公开了一种搜索引擎分词装置。
Description
技术领域
本发明涉及计算机科学技术领域,特别涉及一种通过预计算优化搜索引擎分词的方法及搜索引擎分词装置。
背景技术
分词是搜索引擎最基本的功能,是搜索引擎根据用户提交的关键词串用各种方法进行匹配的一种技术。现有搜索引擎为了达到较好的分词效果,分词词典容量一般都比较大,并且采用明文分词词典,通过线上计算的方式生成内部的数据结构。现有搜索引擎一般采用线性索引表、倒排表、散列(hash)和搜索树等数据结构。线性索引表和倒排表都是静态索引结构。散列(Hash)是通过特定的散列函数和与之配套的处理冲突方法,将字符映射到某个存储位置,在搜索时只要对字符进行Hash计算就能得到存储位置。
现有技术的缺点如下:
(1)、静态搜索搜索时间与分词词典的大小相关,当词典容量大的时候响应时间长,难以达到O(1)的量级,并且静态搜索在词典变更时需要做的改动较大。
(2)、散列搜索速度快,时间复杂度能够优化到O(1),但是空间利用率低,内存占用大,并且查询时间也依赖于Hash冲突处理机制的设计。
(3)、分词词典大导致载入时间长,使得搜索产品应对故障的响应不够敏捷,容易造成流量的大规模损失,同时模块启动时间长也会影响到日常产品运维的效率。
(4)、载入过程中大量的计算和频繁的IO操作,容易给线上服务的稳定性造成冲击。
发明内容
本发明的目的旨在至少解决上述技术缺陷之一。
为此,本发明的目的在于提出一种通过预计算优化搜索引擎分词的方法,通过优先考虑Trie树子节点数目较多节点的转移字符以及空闲碎片的有效利用,提高了空间利用率,并通过进行线下的预计算,提高了搜索引擎线上分词模块的载入速度,不需要耗费大量计算资源和频繁IO,不会对线上服务的稳定性造成冲击。通过签名还能够有效避免词典文件格式错误或者内容缺失对分词效果的影响。
本发明的第二个目的在于提供一种通过预计算优化搜索引擎分词的系统。
为达到上述目的,本发明第一方面的实施例公开了一种通过预计算优化搜索引擎分词的方法。该方法包括以下步骤:按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对所述Trie树子节点的数目多的字符优先进行编码;根据所述序列码进行预计算以生成双数组Trie树的第一数组和第二数组;根据所述序列码、所述第一数组和所述第二数组在所述分词词典中进行分词查询。
由于序列码是优先考虑Trie树子节点数目较多节点的转移字符,因此这部分子节点最后在双数组存储的时候一般都是连续的,从而在查询时间保持O(1)的量级的同时提高了空间利用率,降低了内存占用。
在本发明的一个实施例中,还包括:
将所述序列码、所述第一数组和所述第二数组转换为二进制文件,并生成相应的签名。在搜索引擎线上服务时,分词模块能直接从二进制文件进行载入,载入速度快,避免了大量的计算和频繁的IO操作,并且不会对线上服务的稳定性造成冲击。生成的相应签名能够预防文件格式和内容的错误。
在本发明的一个实施例中,还包括:
将所述序列码、所述第一数组和所述第二数组进行尾部位置空间截断。尾部位置空间截断能够有效节省内存。
在本发明的一个实施例中,所述按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码进一步包括:
计算每个字符的Trie树子节点的数目;
根据所述Trie树子节点的数目依次对所述字符的内码进行哈希计算以生成所述序列码,并根据所述字符在所述分词词典中词语中的位置确定所述字符的节点位置。
在本发明的一个实施例中,所述根据序列码进行预计算以生成双数组Trie树的第一数组和第二数组进一步包括:
根据所述Trie树子节点的数目依次将所述序列码中的字符填入所述第一数组和所述第二数组。
在本发明的一个实施例中,其中,
如果所述字符所代表的词属于所述分词词典,则所述字符在所述第一数组中对应的值为0,或者所述字符在所述第二数组中对应的值为负值;
如果所述字符为中间节点,则所述字符在所述第一数组中对应的值非0。
在本发明的一个实施例中,其中,
如果所述字符在所述第一数组中对应的值为负值,则表示向前查找空闲位置。对于子节点数较少节点的转移字符,在填充数组的时候采用从前向后回溯的方式来填补前面产生的空隙,将之前闲置的零散节点回收利用,从而更进一步提高了空间利用率。
本发明第一方面的实施例公开了一种搜索引擎分词装置,包括:
序列码生成模块,用于按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对所述Trie树子节点的数目多的字符优先进行编码;
数组生成模块,用于根据所述序列码进行预计算以生成双数组Trie树的第一数组和第二数组;以及
分词查询模块,用于根据所述序列码、所述第一数组和所述第二数组在所述分词词典中进行分词查询。
搜索引擎分词装置中,由于序列码是优先考虑Trie树子节点数目较多节点的转移字符,因此这部分子节点最后在双数组存储的时候一般都是连续的,从而在查询时间保持O(1)的量级的同时提高了空间利用率,降低了内存占用。
在本发明的一个实施例中,还包括:
转换模块,用于将所述序列码、所述第一数组和所述第二数组转换为二进制文件,并生成相应的签名。在搜索引擎线上服务时,分词模块能直接从二进制文件进行载入,载入速度快,避免了大量的计算和频繁的IO操作,并且不会对线上服务的稳定性造成冲击。生成的相应签名能够预防文件格式和内容的错误。
在本发明的一个实施例中,所述转换模块还用于将所述序列码、所述第一数组和所述第二数组进行尾部位置空间截断。尾部位置空间截断能够有效节省内存。
在本发明的一个实施例中,所述序列码生成模块进一步包括:
计算子模块,用于计算每个字符的Trie树子节点的数目;以及
生成子模块,用于根据所述Trie树子节点的数目依次对所述字符的内码进行哈希计算以生成所述序列码,并根据所述字符在所述分词词典中词语中的位置确定所述字符的节点位置。
在本发明的一个实施例中,所述数组生成模块根据所述Trie树子节点的数目依次将所述序列码中的字符填入所述第一数组和所述第二数组。
在本发明的一个实施例中,其中,
如果所述字符所代表的词属于所述分词词典,则所述字符在所述第一数组中对应的值为0,或者所述字符在所述第二数组中对应的值为负值;
如果所述字符为中间节点,则所述字符在所述第一数组中对应的值非0。
在本发明的一个实施例中,其中,
如果所述字符在所述第一数组中对应的值为负值,则表示向前查找空闲位置。
本发明附加的方面和优点将在下面的描述中部分给出,部分将从下面的描述中变得明显,或通过本发明的实践了解到。
附图说明
本发明上述的和/或附加的方面和优点从下面结合附图对实施例的描述中将变得明显和容易理解,其中:
图1为根据本发明实施例的通过预计算优化搜索引擎分词的方法的流程框图;
图2为本发明具体实施例的Trie树示意图;
图3为根据本发明实施例的双数组内容示意图;以及
图4为根据本发明实施例的搜索引擎分词装置的结构图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能解释为对本发明的限制。
下面参考图1至图3描述根据本发明实施例的通过预计算优化搜索引擎分词的方法。
在本发明的一个实施例中,分词词典里内容包括:啊、阿根廷、阿胶、阿拉伯、阿拉伯人、埃及。根据分词词典生成的Trie树如图2所示。可以理解的是,上述分词词典以及Trie树仅出于示例的目的,本发明实施例并不限于此。
步骤S110:按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对Trie树子节点的数目多的字符优先进行编码。
按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码进一步包括:
步骤S111:计算每个字符的Trie树子节点的数目。
步骤S112:根据Trie树子节点的数目依次对字符的内码进行哈希计算以生成序列码,并根据字符在分词词典中词语中的位置确定字符的节点位置(例如为中间节点或叶子节点)。
在本发明的一个实施例中,汉字的内码由两个字节组成,共计65536个,一般分词词典中出现的字符小于内码总数,设计时将序列码为连续的。按照图2所示的Trie树对分词词典中字符按照Trie树子节点的数目递减的顺序进行编码,生成序列码如表1所示,
啊 | 阿 | 埃 | 根 | … | 胶 | 拉 | 及 | 廷 | 伯 | 人 | ||
1 | 2 | 3 | 4 | … | 5 | 6 | 7 | 8 | 9 | 10 |
表1
表1中第一行存储字符,第二行存储与该字符对应的序列码,例如,“啊”的序列码为1,“阿”的序列码为2。采用code数组来表示序列表,选择适当的hash函数,使得hash计算量小,并且序列码表的长度和出现过的字符数差距较小。当给定一个字符时,将其内码通过hash函数进行转换,能够在O(1)的时间内得到该字符对应的序列码。可以理解的是,上述序列码以及code数组仅出于示例的目的,本发明实施例并不限于此。
步骤S120:根据序列码进行预计算以生成双数组Trie树的第一数组和第二数组;
根据序列码进行预计算以生成双数组Trie树的第一数组和第二数组进一步包括:
步骤S121:根据Trie树子节点的数目依次将序列码中的字符填入第一数组和第二数组。在本发明的一个实施例中,将第一数组记作数组base[],将第二数组记作数组check[]。从Trie树子节点数最多的节点开始,选择图2中第一层的转移条件“啊”、“阿”和“埃”,根据表1得到对应的序列码分别为1、2、3,如图3所示,依次放入双数组对应的1、2、3的位置上,再继续选择子节点最多的节点3,转移条件分别为“根”、“胶”和“拉”,根据表1查出对应的序列码分别为4、5、6。由于序列码是优先考虑Trie树子节点数目较多节点的转移字符,因此这部分子节点最后在双数组存储的时候一般都是连续的,从而提高了空间利用率。对于子节点数较少节点的转移字符,在填充数组的时候采用从前向后回溯的方式来填补前面产生的空隙,将之前闲置的零散节点回收利用,尤其对于含有大量专有名字的分词词典,能够更进一步提高了空间利用率。如图3所示,“阿拉”在双数组对应的7的位置上,“埃及”在双数组对应的8的位置上等。
步骤S122:如果字符所代表的词属于分词词典,则字符在第一数组中对应的值为0,或者字符在第二数组中对应的值为负值。在本发明的一个实施例中,由于Trie树中节点2是叶子节点,因此“啊”对应的base[1]标记为0,Check值标记为0,check值标记为0表示对应的节点父节点为根节点;由于“阿胶”是一个分词词典中的词,因此“阿胶”对应的base[6]=0,check[6]=-check[6]。
步骤S123:如果字符为中间节点,则字符在第一数组中对应的值非0。“阿”为中间节点,设置“阿”对应的base[2]=1。
在本发明的一个实施例中,每次为序列码中的字符查找存储空间时,不能使用字符的序列码所对应的数组的位置,必须向前或者向后移动1个单位及以上。例如“根”的序列码是4,那么即使base[4]和check[4]这两个位置目前是空闲的也不可以使用,需要向前或者向后移动1个单位及以上。此处设置单位为数组的一个位置。可以理解的是,上述单位仅出于示例目的,本发明不限于此。具体设置“阿”对应的base[2]=1过程如下:词典中以“阿”为前缀的词有“阿根廷”、“阿胶”和“阿拉伯”三个。“根”,“胶”和“拉”是“阿”的子节点,需要在数组中为这些子节点找到合适的存储空间。根据表1得出“根”、“胶”和“拉”的编码分别是4、5和6,首先从第一数组base[]和第二数组check[]中向数组后方移动1个单位,得出存在连续的三个空位可以放入“根”,“胶”和“拉”三个子节点,即能满足base[1+4]=check[1+4]=0;base[1+5]=check[1+5]=0;base[1+6]=check[1+6]=0。因此设置base[2]=1。
设置check[5]=check[6]=check[7]=2,表示5、6、7这三个位置对应的节点的父节点是数组的第二个位置上对应的结点,即“阿根”、“阿胶”、“阿拉”的父节点为“阿”。
步骤S124:如果字符在第一数组中对应的值为负值,则表示向前查找空闲位置。例如,“阿拉伯”对应的base[10]=-6。
步骤S130:根据序列码、第一数组和第二数组在分词词典中进行分词查询。
在本发明的一个实施例中,具体的查询过程为:s表示上一个状态时字符在数组中的位置,c表示当前状态时字符的序列码,t表示下一状态转移后字符在数组中的位置,查询过程的伪代码如下:
下面以查询“阿拉伯”是否在分词词典中为例描述查询过程:
(1)、查找“阿”在表1中对应的序列码为2,则“阿”对应双数组中第2个位置,查找双数组得到base[2]=1;
(2)、查找“拉”在表1中对应的的序列码为6,检查check[base[2]+6]的绝对值,也就是|check[7]|=2;
(3)接着找到“伯”的序列码为9,检查check[base[7]+9]的绝对值,即|check[10]|=7,并且check[10]为负数,由以上定义可知“阿拉伯”为叶节点,表示“阿拉伯”在分词词典中,是一个合法的分词,查询过程结束。可以理解的是,上述具体的查询过程仅出于实例目的,本发明不限于此。
在本发明的一个实施例中,将序列码、第一数组和第二数组进行尾部位置空间截断,按照设计的格式进行序列化后写入二进制文件,例如存储为word.bin,并生成相应的签名。
将序列码、第一数组和第二数组进行尾部位置空间截断能够有效节省内存,并且在搜索引擎线上服务时,分词模块直接从二进制文件进行载入,速度快,避免了大量的计算和频繁的IO操作,不会对线上服务的稳定性造成冲击。生成的相应签名还能够预防文件格式和内容的错误。
下面根据图4来描述根据本发明实施例的搜索引擎分词装置1000,其特征在于,包括:序列码生成模块100,用于按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对Trie树子节点的数目多的字符优先进行编码;数组生成模块200,用于根据序列码进行预计算以生成双数组Trie树的第一数组和第二数组;分词查询模块300,用于根据序列码、第一数组和第二数组在分词词典中进行分词查询;转换模块400,用于将序列码、第一数组和第二数组转换为二进制文件。
在本发明的一个实施例中,分词词典内容包括:啊、阿根廷、阿胶、阿拉伯、阿拉伯人、埃及。根据分词词典生成的Trie树如图2所示。可以理解的是,上述分词词典以及Trie树仅出于示例的目的,本发明实施例并不限于此。
序列码生成模块100进一步包括:
计算子模块110,用于计算每个字符的Trie树子节点的数目;
生成子模块120,用于根据Trie树子节点的数目依次对字符的内码进行哈希计算以生成序列码,并根据字符在分词词典中词语中的位置确定字符的节点位置。(例如为中间节点或叶子节点)
在本发明的一个实施例中,汉字的内码由两个字节组成,共计65536个,一般分词词典中出现的字符小于内码总数,设计时将序列码为连续的。计算子模块110对图2所示的Trie树的每个节点进行计算,生成子模块120对字符的内码进行哈希计算生成序列码,序列码如表1所示。表1中第一行存储字符,第二行存储与该字符对应的序列码,例如,“啊”的序列码为1,“阿”的序列码为2。生成子模块120采用code数组来表示序列表,并且生成子模块120选择适当的hash函数,使得hash计算量小,并且序列码表的长度和出现过的字符数差距较小。当给定一个字符时,生成子模块120将其内码通过hash函数进行转换,能够在O(1)的时间内得到该字符对应的序列码。可以理解的是,上述序列码以及code数组仅出于示例的目的,本发明实施例并不限于此。
数组生成模块200根据Trie树子节点的数目依次将序列码中的字符填入第一数组和第二数组。
在本发明的一个实施例中,数组生成模块200将第一数组记作数组base[],将第二数组记作数组check[]。数组生成模块200从Trie树子节点数最多的节点开始,选择图2中第一层的转移条件“啊”、“阿”和“埃”,根据表1得到对应的序列码分别为1、2、3,如图3所示,数组生成模块200依次将其放入双数组对应的1、2、3的位置上,再继续选择子节点最多的节点3,转移条件分别为“根”、“胶”和“拉”,根据表1查出对应的序列码分别为4、5、6。由于序列码是优先考虑Trie树子节点数目较多节点的转移字符,因此这部分子节点最后在双数组存储的时候一般都是连续的,从而提高了空间利用率。数组生成模块200对于子节点数较少节点的转移字符,在填充数组的时候采用从前向后回溯的方式来填补前面产生的空隙,将之前闲置的零散节点回收利用,尤其对于含有大量专有名字的分词词典,能够更进一步提高了空间利用率。如图3所示,“阿拉”在双数组对应的7的位置上,“埃及”在双数组对应的8的位置上等。
如果字符所代表的词属于分词词典,则字符在第一数组中对应的值为0,或者字符在第二数组中对应的值为负值。
在本发明的一个实施例中,由于Trie树中节点2是叶子节点,因此“啊”对应的base[1]标记为0,Check值标记为0,check值标记为0表示对应的节点父节点为根节点;由于“阿胶”是一个分词词典中的词,因此“阿胶”对应的base[6]=0,check[6]=-check[6]。
如果字符为中间节点,则字符在第一数组中对应的值非0。
在本发明的一个实施例中,数组生成模块200每次为序列码中的字符查找存储空间时,不能使用字符的序列码所对应的数组的位置,必须向前或者向后移动1个单位及以上。例如“根”的序列码是4,那么即使base[4]和check[4]这两个位置目前是空闲的也不可以使用,需要向前或者向后移动1个单位及以上。此处数组生成模块200设置单位为数组的一个位置。可以理解的是,上述单位仅出于示例目的,本发明不限于此。数组生成模块200具体设置“阿”对应的base[2]=1过程如下:词典中以“阿”为前缀的词有“阿根廷”、“阿胶”和“阿拉伯”三个。“根”,“胶”和“拉”是“阿”的子节点,数组生成模块200需要在数组中为这些子节点找到合适的存储空间。根据表1得出“根”、“胶”和“拉”的编码分别是4、5和6,首先从第一数组base[]和第二数组check[]中向数组后方移动1个单位,得出存在连续的三个空位可以放入“根”,“胶”和“拉”三个子节点,即能满足base[1+4]=check[1+4]=0;base[1+5]=check[1+5]=0;base[1+6]=check[1+6]=0。因此设置base[2]=1。
数组生成模块200设置check[5]=check[6]=check[7]=2,表示5、6、7这三个位置对应的节点的父节点是数组的第二个位置上对应的结点,即“阿根”、“阿胶”、“阿拉”的父节点为“阿”。
如果字符在第一数组中对应的值为负值,则表示向前查找空闲位置。
例如,“阿拉伯”对应的base[10]=-6。
在本发明的一个实施例中,分词查询模块300具体的查询过程为:分词查询模块300以s表示上一个状态时字符在数组中的位置,c表示当前状态时字符的序列码,t表示下一状态转移后字符在数组中的位置,分词查询模块300查询过程的伪代码如下:
下面以分词查询模块300查询“阿拉伯”是否在分词词典中为例描述查询过程:
(1)、分词查询模块300查找“阿”在表1中对应的序列码为2,则“阿”对应双数组中第2个位置,分词查询模块300查找双数组得到base[2]=1;
(2)、分词查询模块300查找“拉”在表1中对应的的序列码为6,检查check[base[2]+6]的绝对值,也就是|check[7]|=2;
(3)分词查询模块300接着找到“伯”的序列码为9,检查check[base[7]+9]的绝对值,即|check[10]|=7,并且check[10]为负数,“阿拉伯”在分词词典中,分词查询模块300判断“阿拉伯”为合法的分词,查询过程结束。可以理解的是,上述分词查询模块300具体的查询过程仅出于实例目的,本发明不限于此。
转换模块400还用于将序列码、第一数组和第二数组进行尾部位置空间截断,并生成相应的签名。
在本发明的一个实施例中,转换模块400将序列码、第一数组和第二数组进行尾部位置空间截断,按照设计的格式进行序列化后写入二进制文件,例如存储为word.bin,并生成相应的签名。转换模块400将序列码、第一数组和第二数组进行尾部位置空间截断能够有效节省内存,并且在搜索引擎线上服务时,分词模块直接从二进制文件进行载入,速度快,避免了大量的计算和频繁的IO操作,不会对线上服务的稳定性造成冲击。生成的相应签名还能够预防文件格式和内容的错误。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同限定。
Claims (10)
1.一种通过预计算优化搜索引擎分词的方法,其特征在于,包括以下步骤:
按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对所述Trie树子节点的数目多的字符优先进行编码,其中,计算每个字符的Trie树子节点的数目,并根据所述Trie树子节点的数目递减的顺序依次对所述字符的内码进行哈希计算以生成所述序列码,并根据所述字符在所述分词词典中词语中的位置确定所述字符的节点位置;
根据所述序列码进行预计算以生成双数组Trie树的第一数组和第二数组,其中,根据所述Trie树子节点的数目从Trie树子节点数最多的节点开始依次将所述序列码中的字符填入所述第一数组和所述第二数组,其中,对于所述Trie树子节点的数目较少的转移字符,在填入所述第一数组和所述第二数组时采用从前向后回溯的方式;以及
根据所述序列码、所述第一数组和所述第二数组在所述分词词典中进行分词查询。
2.如权利要求1所述的通过预计算优化搜索引擎分词的方法,其特征在于,还包括:
将所述序列码、所述第一数组和所述第二数组转换为二进制文件,并生成相应的签名。
3.如权利要求2所述的通过预计算优化搜索引擎分词的方法,其特征在于,还包括:
将所述序列码、所述第一数组和所述第二数组进行尾部位置空间截断。
4.如权利要求3所述的通过预计算优化搜索引擎分词的方法,其特征在于,其中,
如果所述字符所代表的词属于所述分词词典,则所述字符在所述第一数组中对应的值为0,或者所述字符在所述第二数组中对应的值为负值;
如果所述字符为中间节点,则所述字符在所述第一数组中对应的值非0。
5.如权利要求1所述的通过预计算优化搜索引擎分词的方法,其特征在于,其中,
如果所述字符在所述第一数组中对应的值为负值,则表示向前查找空闲位置。
6.一种搜索引擎分词装置,其特征在于,包括:
序列码生成模块,用于按照Trie树子节点的数目对分词词典中字符进行编码以生成序列码,其中,对所述Trie树子节点的数目多的字符优先进行编码,其中,所述序列码生成模块进一步包括,
计算子模块,用于计算每个字符的Trie树子节点的数目;以及
生成子模块,用于根据所述Trie树子节点的数目递减的顺序依次对所述字符的内码进行哈希计算以生成所述序列码,并根据所述字符在所述分词词典中词语中的位置确定所述字符的节点位置;
数组生成模块,用于根据所述序列码进行预计算以生成双数组Trie树的第一数组和第二数组,其中,所述数组生成模块根据所述Trie树子节点的数目从Trie树子节点数最多的节点开始依次将所述序列码中的字符填入所述第一数组和所述第二数组,其中,对于所述Trie树子节点的数目较少的转移字符,在填入所述第一数组和所述第二数组时采用从前向后回溯的方式;以及
分词查询模块,用于根据所述序列码、所述第一数组和所述第二数组在所述分词词典中进行分词查询。
7.如权利要求6所述的搜索引擎分词装置,其特征在于,还包括:
转换模块,用于将所述序列码、所述第一数组和所述第二数组转换为二进制文件,并生成相应的签名。
8.如权利要求7所述的搜索引擎分词装置,其特征在于,所述转换模块还用于将所述序列码、所述第一数组和所述第二数组进行尾部位置空间截断。
9.如权利要求8所述的搜索引擎分词装置,其特征在于,其中,
如果所述字符所代表的词属于所述分词词典,则所述字符在所述第一数组中对应的值为0,或者所述字符在所述第二数组中对应的值为负值;
如果所述字符为中间节点,则所述字符在所述第一数组中对应的值非0。
10.如权利要求9所述的搜索引擎分词装置,其特征在于,其中,
如果所述字符在所述第一数组中对应的值为负值,则表示向前查找空闲位置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210096557.0A CN102651026B (zh) | 2012-04-01 | 2012-04-01 | 通过预计算优化搜索引擎分词的方法及搜索引擎分词装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210096557.0A CN102651026B (zh) | 2012-04-01 | 2012-04-01 | 通过预计算优化搜索引擎分词的方法及搜索引擎分词装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102651026A CN102651026A (zh) | 2012-08-29 |
CN102651026B true CN102651026B (zh) | 2015-02-18 |
Family
ID=46693034
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210096557.0A Active CN102651026B (zh) | 2012-04-01 | 2012-04-01 | 通过预计算优化搜索引擎分词的方法及搜索引擎分词装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102651026B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103365991B (zh) * | 2013-07-03 | 2017-03-08 | 深圳市华傲数据技术有限公司 | 一种基于一维线性空间实现Trie树的词典存储管理方法 |
CN103365992B (zh) * | 2013-07-03 | 2017-02-15 | 深圳市华傲数据技术有限公司 | 一种基于一维线性空间实现Trie树的词典检索方法 |
CN104331397B (zh) * | 2014-06-19 | 2017-07-07 | 深圳市迪威泰实业有限公司 | 一种机器翻译方法及系统 |
CN104156415B (zh) * | 2014-07-31 | 2017-04-12 | 沈阳锐易特软件技术有限公司 | 解决医疗数据标准编码对照问题的映射处理系统及方法 |
CN104579567B (zh) * | 2015-01-08 | 2018-10-12 | 无锡清华信息科学与技术国家实验室物联网技术中心 | 逆向路径的编码方法和装置 |
CN107291785A (zh) * | 2016-04-12 | 2017-10-24 | 滴滴(中国)科技有限公司 | 一种数据查找方法及装置 |
CN108628907B (zh) * | 2017-03-24 | 2021-09-17 | 北京京东尚科信息技术有限公司 | 一种用于基于Aho-Corasick的Trie树多关键词匹配的方法 |
CN109933774A (zh) * | 2017-12-15 | 2019-06-25 | 腾讯科技(深圳)有限公司 | 语义识别方法、装置存储介质和电子装置 |
CN109377980B (zh) * | 2018-08-31 | 2022-06-07 | 众安信息技术服务有限公司 | 一种音节切分方法和装置 |
CN109684439B (zh) * | 2018-12-28 | 2020-10-30 | 语联网(武汉)信息技术有限公司 | 分词过程中进行前缀索引的方法及装置 |
CN110287426B (zh) * | 2019-05-23 | 2021-12-31 | 北京百度网讯科技有限公司 | 兴趣点父子关系的建立方法、装置、存储介质及处理器 |
CN111309970A (zh) * | 2020-03-27 | 2020-06-19 | 北京奇艺世纪科技有限公司 | 一种数据检索方法、装置、电子设备及存储介质 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1786962A (zh) * | 2005-12-21 | 2006-06-14 | 中国科学院计算技术研究所 | 完美双数组trie树词典管理与检索方法 |
-
2012
- 2012-04-01 CN CN201210096557.0A patent/CN102651026B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1786962A (zh) * | 2005-12-21 | 2006-06-14 | 中国科学院计算技术研究所 | 完美双数组trie树词典管理与检索方法 |
Also Published As
Publication number | Publication date |
---|---|
CN102651026A (zh) | 2012-08-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102651026B (zh) | 通过预计算优化搜索引擎分词的方法及搜索引擎分词装置 | |
CN100444167C (zh) | 完美双数组trie树词典管理与检索方法 | |
CN101276361B (zh) | 一种显示相关关键词的方法及系统 | |
CN107291785A (zh) | 一种数据查找方法及装置 | |
CN104283567A (zh) | 一种名称数据的压缩、解压缩方法及设备 | |
CN110008256A (zh) | 一种基于分层可导航小世界图的近似最近邻搜索方法 | |
CN101326522B (zh) | Xml的简明索引结构 | |
CN101673307A (zh) | 空间数据索引方法及系统 | |
CN103810237A (zh) | 数据管理方法和系统 | |
CN104246765A (zh) | 图像检索装置、图像检索方法、程序以及计算机可读取的存储介质 | |
CN1504912A (zh) | 用树状分段改善树搜索性能和存储器带宽的方法和系统 | |
EP2544414A1 (en) | Method and device for storing routing table entry | |
CN106874425B (zh) | 基于Storm的实时关键词近似搜索算法 | |
CN101324896A (zh) | 一种矢量数据的存储方法、查询方法和管理系统 | |
CN107330094B (zh) | 动态存储键值对的布鲁姆过滤器树结构及键值对存储方法 | |
CN101286935A (zh) | 一种基于ip地址范围的路由查找方法 | |
CN104221015A (zh) | 图像检索装置、图像检索方法、程序以及计算机可读取的存储介质 | |
CN103051543A (zh) | 一种路由前缀的处理、查找、增加及删除方法 | |
WO2019060351A1 (en) | SYSTEM AND METHOD FOR USING LOW MEMORY CONSUMPTION DATA STRUCTURES FOR FRIMOUSSES SUGGESTIONS | |
CN103020144A (zh) | 文件管理系统和文件管理方法 | |
CN111078952B (zh) | 一种基于层次结构的跨模态可变长度哈希检索方法 | |
CN102325161B (zh) | 一种基于查询工作量估算的xml分片方法 | |
CN116301656A (zh) | 基于日志结构合并树的数据存储方法、系统及设备 | |
US20120259862A1 (en) | Method and apparatus for processing A query | |
JP2009093556A (ja) | インデクス構築方法、文書検索装置及びインデクス構築プログラム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |