【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱: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. 科技公司升职的谎言与真相
  2. 第三周总结CoreIDRAW
  3. cmd 调试java_JAVA学习笔记(初级)--CMD调试
  4. SpringScerity的使用
  5. hadoop2.7.3用mapreduce计算pi值
  6. (数组) leetcode 189. Rotate Array
  7. php中如何计算字符串长度,PHP字符串长度计算 - strlen()函数使用介绍
  8. S变换在特征提取中的使用
  9. 华为十年,总结出的12条经验!(作者是一级部门总监,华为副总裁)
  10. F28335的储存器及其地址分配
  11. python的py、pyc、pyo、pyd文件区别
  12. 电信保温杯笔记——《统计学习方法(第二版)——李航》第16章 主成分分析
  13. 访问WebLogic For AIX忽快忽慢的困惑——续篇
  14. 百度创始人李彦宏:互联网的下一章
  15. Sun Solaris
  16. android studio安装GRADLE下载慢的问题
  17. stm32之IIC总线概述
  18. 关于Nvidia卡在注册界面的问题
  19. WINDOWS10 启动失败 你的电脑/设备需要修复
  20. Maven 教程之发布 jar 到私服或中央仓库

热门文章

  1. NBA理性分析:30年最强夺冠阵容
  2. DecimalFormat的用法
  3. tomcat PermGen space 不足的解决方法
  4. windows中开启snmp
  5. 让电脑替你说:"I IOVE YOU"
  6. The operation could not be performed because OLE DB provider SQLNCLI11 for linked server SDSSDFCC...
  7. JarvisOJ Basic 熟悉的声音
  8. MyBatis 延迟加载的三种加载方式深入,你get了吗?
  9. direct.h头文件(对目录操作)
  10. poj3463 最短路和次短路 计数