搜索引擎的那些事(中文分词)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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进行分词处理,词库数量必须足够多。
搜索引擎的那些事(中文分词)相关推荐
- [转载]中文搜索引擎技术揭密:中文分词
前言 信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google.百度.yisou.中搜等大型搜索引擎一直人们讨论的话题.随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴 ...
- 基于Java、JSP中文分词的搜索引擎的设计与实现
技术:Java.JSP等 摘要: 网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情.建立搜索引擎就是解决这个问题的最好方法.本文首先详细介绍了基于英特网的搜索引擎的系统结构,然后从网络机 ...
- 浅谈SEO的关键:中文分词(上)
在搜索引擎技术中,中文分词对于影响搜索引擎结果排序有着至关重要的作用.我们在实际的搜索引擎优化中,为了避免很多主关键词的大量竞争,也会使用到中文分词技术来做SEO优化.举个简单的例子,假如我们需要优化 ...
- NLP|中文分词技术及应用
摘要:中文分词是中文信息处理的重要基础,本文详细阐述了目前主要的几种中文分词算法的技术原理 .中文分词目前的瓶颈和评价准则,以及中文分词的具体应用. 中文分词指将一个汉字序列切分成一个个单独的词.现有 ...
- 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较...
本文的目标有两个: 1.学会使用11大Java开源中文分词器 2.对比分析11大Java开源中文分词器的分词效果 本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那 ...
- 中文分词技术比较:单字切分 vs 中文分词
全文信息检索系统中,创建倒排索引时应当使用什么分词方式一直是众说纷纭,毫无定论. 具我所知,已有某某 paper "研究指出"采用二元切分的方式构建索引是"最好的& ...
- datetimepicker中文不生效_搜索引擎技术(二十)- elasticsearch - 中文分词器
步骤1:分词器概念 步骤2:安装中文分词器步骤3:重启 ElasticSearch步骤4:测试中文分词效果 步骤 1 : 分词器概念 分词器指的是搜索引擎如何使用关键字进行匹配,如 入门 中的关键字: ...
- 搜索引擎分词:Nutch整合Paoding中文分词步骤详解
搜索引擎+B2B平台+SNS网站=?, 一个三不像网站.偏偏投资人需要这样一个三不像网站.从4月份开始组建团队.时间一瞬2个月过去了.做B2B需要的就是大工作量和时间,而做搜索引擎光分词这块就搞的头大 ...
- 大数据搜索引擎原理分析——设计并实现一个中文分词的算法
实验报告下载链接: https://download.csdn.net/download/qq_37636795/16337679 南华大学 计算机科学与技术学院 实验报告 ( 2020 ~2021 ...
最新文章
- 科技公司升职的谎言与真相
- 第三周总结CoreIDRAW
- cmd 调试java_JAVA学习笔记(初级)--CMD调试
- SpringScerity的使用
- hadoop2.7.3用mapreduce计算pi值
- (数组) leetcode 189. Rotate Array
- php中如何计算字符串长度,PHP字符串长度计算 - strlen()函数使用介绍
- S变换在特征提取中的使用
- 华为十年,总结出的12条经验!(作者是一级部门总监,华为副总裁)
- F28335的储存器及其地址分配
- python的py、pyc、pyo、pyd文件区别
- 电信保温杯笔记——《统计学习方法(第二版)——李航》第16章 主成分分析
- 访问WebLogic For AIX忽快忽慢的困惑——续篇
- 百度创始人李彦宏:互联网的下一章
- Sun Solaris
- android studio安装GRADLE下载慢的问题
- stm32之IIC总线概述
- 关于Nvidia卡在注册界面的问题
- WINDOWS10 启动失败 你的电脑/设备需要修复
- Maven 教程之发布 jar 到私服或中央仓库
热门文章
- NBA理性分析:30年最强夺冠阵容
- DecimalFormat的用法
- tomcat PermGen space 不足的解决方法
- windows中开启snmp
- 让电脑替你说:"I IOVE YOU"
- The operation could not be performed because OLE DB provider SQLNCLI11 for linked server SDSSDFCC...
- JarvisOJ Basic 熟悉的声音
- MyBatis 延迟加载的三种加载方式深入,你get了吗?
- direct.h头文件(对目录操作)
- poj3463 最短路和次短路 计数