【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

前面,我们在介绍搜索引擎的时候也谈到过中文分词。和英文不一样,中文上所有的汉字都是连在一起的,所以我们的一项工作就是把这些词语拆分成一个一个词组。因为只有这样才能构建索引数据库、才能查找索引,我们构建搜索引擎的工作才能继续进行下去。

现在关于中分分词有好多的分词方法,什么从左向右最大长度法、从右向左最大长度法、最少词组法、贝叶斯概率处理法等等。但是说了这么多,我们分词的标准是什么,关键还在于有一个好的分词字典。中国汉字那么多,但是数量上估计几万个足够了。但是如果汉字与汉字组合起来构成词组,那数量就多了去了,比如说文学词语、口语、人名、地名、诗词、专业术语等等。说到这里,可以给大家举个例子看一下。大家都喜欢搜狗输入法,一方面它的设计比较人性化,另外一方面不正是因为它词库很多、使用方便吗?

关于分词的算法,有的人觉得很玄乎,其实写一个也不复杂,我们就可以写一个最大长度遍历的分词算法。当然这里只是考虑了汉字分词,如果是英文、数字、繁体字或者符号,那就要另外考虑了。这也验证了我们之前反复说的一句话,简单做一件事不难,关键是怎么做好了、干漂亮了、高效又能节省成本。

#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>
#define LENGTH 256
static char* dic[] = {"北京", "大学", "北京大学"};
#define NUMBER (sizeof(dic) / sizeof(char*))
static char* buffer[LENGTH] = {0};
static int max_len = 0;
static int min_len = 0;
static int  find_max_length()
{
int index;
unsigned int len;
len = 0;
for(index = 0; index < NUMBER; index ++)
{
if(len < strlen(dic[index]))
{
len = strlen(dic[index]);
}
}
return len;
}
static int find_min_length()
{
int index;
unsigned int len;
len = strlen(dic[0]);
for(index = 1; index < NUMBER; index++)
{
if(strlen(dic[index]) < len)
{
len = strlen(dic[index]);
}
}
return len;
}
static void show_buffer(int end)
{
int start;
for(start = 0; start < end; start ++)
{
printf("%s ", buffer[start]);
}
printf("\n");
}
static void _process_segment(char* str, int index)
{
int start;
int len ;
int  found;
char* data;
char* label;
if('\0' == *str)
{
show_buffer(index);
return;
}
label = str + strlen(str);
retry:
len = strlen(str);
if(len > LENGTH)
{
len = LENGTH;
}
if(len > max_len)
{
len = max_len;
}
found = 0;
while(len >= min_len)
{
for(start = 0; start < NUMBER; start ++)
{
if(0 == strncmp(str, dic[start], len))
{
found = 1;
break;
}
}
if(found)
{
break;
}
len --;
}
/* if no str was found, just step forward, but cannot beyond label */
if(len < min_len && str < label)
{
str ++;
goto retry;
}
/* if no str was left, show all the str */
if(str >= label)
{
show_buffer(index);
return;
}
data = (char*) malloc(len + 1);
if(NULL == data)
{
return;
}
data[len] = '\0';
memmove(data, str, len);
buffer[index] = data;
_process_segment(str + len, index + 1);
free(data);
buffer[index] = NULL;
}
void process_segment(char* str)
{
int length;
if(NULL == str)
{
return;
}
length = strlen(str);
if(length > LENGTH)
{
return;
}
_process_segment(str, 0);
}
void segment_init()
{
min_len = find_min_length();
max_len = find_max_length();
memset(buffer, 0,  sizeof(buffer));
}
int main(int argc, char* argv[])
{
segment_init();
process_segment("北京 大学 日本");
return 1;
}  

代码中最复杂的函数其实就是_segment_process这个函数,中间涉及的情况比较多,可以简单介绍一下:

(1)分词的时候建议考虑一下当前词库的最小长度和最大长度,可以避免不必要的比较;

(2)分词如果查找失败,跳过从下一个字节开始继续查找;

(3)函数采用了递归的方法,注意函数出口;

(4)函数编写的时候注意buffer堆栈的浮动处理;

(5)注意函数中判断条件的依据和原因。

(6)这里dic的词库数量太少,要想利用process_segment进行分词处理,词库数量必须足够多。

搜索引擎的那些事(中文分词)相关推荐

  1. [转载]中文搜索引擎技术揭密:中文分词

    前言 信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google.百度.yisou.中搜等大型搜索引擎一直人们讨论的话题.随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴 ...

  2. 基于Java、JSP中文分词的搜索引擎的设计与实现

    技术:Java.JSP等 摘要: 网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情.建立搜索引擎就是解决这个问题的最好方法.本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机 ...

  3. 浅谈SEO的关键:中文分词(上)

    在搜索引擎技术中,中文分词对于影响搜索引擎结果排序有着至关重要的作用.我们在实际的搜索引擎优化中,为了避免很多主关键词的大量竞争,也会使用到中文分词技术来做SEO优化.举个简单的例子,假如我们需要优化 ...

  4. NLP|中文分词技术及应用

    摘要:中文分词是中文信息处理的重要基础,本文详细阐述了目前主要的几种中文分词算法的技术原理 .中文分词目前的瓶颈和评价准则,以及中文分词的具体应用. 中文分词指将一个汉字序列切分成一个个单独的词.现有 ...

  5. 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较...

    本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...

  6. 中文分词技术比较:单字切分 vs 中文分词

    全文信息检索系统中,创建倒排索引时应当使用什么分词方式一直是众说纷纭,毫无定论.    具我所知,已有某某 paper "研究指出"采用二元切分的方式构建索引是"最好的& ...

  7. datetimepicker中文不生效_搜索引擎技术(二十)- elasticsearch - 中文分词器

    步骤1:分词器概念 步骤2:安装中文分词器步骤3:重启 ElasticSearch步骤4:测试中文分词效果 步骤 1 : 分词器概念 分词器指的是搜索引擎如何使用关键字进行匹配,如 入门 中的关键字: ...

  8. 搜索引擎分词:Nutch整合Paoding中文分词步骤详解

    搜索引擎+B2B平台+SNS网站=?, 一个三不像网站.偏偏投资人需要这样一个三不像网站.从4月份开始组建团队.时间一瞬2个月过去了.做B2B需要的就是大工作量和时间,而做搜索引擎光分词这块就搞的头大 ...

  9. 大数据搜索引擎原理分析——设计并实现一个中文分词的算法

    实验报告下载链接: https://download.csdn.net/download/qq_37636795/16337679 南华大学 计算机科学与技术学院 实验报告 ( 2020 ~2021 ...

最新文章

  1. Python爬虫开发:贴吧案例
  2. CF 459A 459B 459C 459D 459E
  3. TypeScript,从0到入门带你进入类型的世界
  4. Java this添加窗口,如何使一个窗口,看起来像这样在Java中? (How to make a window look like this in Java?)...
  5. activity绑定service
  6. 网络编程基础【林老师版】:简单的 套接字通信(一)
  7. 含泪整理最优质草坪灯光域网素材,你想要的这里都有
  8. 豆瓣评分9.0,时隔6年,“Linux命令行圣经”新版终于来了!
  9. Apache Tomcat漏洞总结
  10. uni-app调用wifi接口
  11. ArcGIS介绍 coverage、shapefile 和 geodatabase 这三种矢量数据。
  12. Python 正则表达式(RegEx)
  13. 企业云服务器的选择与配置指南
  14. configure: error: Package requirements (oniguruma) were not met
  15. sigmoid函数及其导数
  16. 能够自动绘制网络拓扑图的软件——WGCLOUD
  17. 身体这些部位不舒服的时候,你知道意味着什么吗?
  18. 【设计模式】用英雄联盟来解释代理模式
  19. 微信小程序(视图与逻辑)
  20. JavaScript中如何严格的判断NaN

热门文章

  1. 细究STP根端口和指定端口的选举过程
  2. Fedora进入超级用户的方法
  3. ARC单例模式的实现
  4. arguments.callee弃用与webuploader
  5. Python入门系列——第14篇
  6. 徐汉彬:亿级Web系统搭建—单机到分布式集群
  7. 多校#5-1005-Instring-HDU5785-manacher+维护
  8. Python天天美味(35) - 细品lambda(转)
  9. jquery插件:图片截取工具jquery.imagecropper.js
  10. WinAPI【远程注入】利用远程线程注入DLLDelphi版