分词技术就是搜索引擎针对用户提交查询的关键词串进行的查询处理后根据用户的关键词串用各种匹配方法进行分词的一种技术。

中文分词(Chinese Word Segmentation)指的是将一个汉字序列(句子)切分成一个一个的单独的词,分词就是将连续的字序列按照一定的规则重新组合成词序列的过程。

现在分词方法大致有三种:基于字符串配置的分词方法、基于理解的分词方法和基于统计的分词方法。

今天为大家分享一个国内使用人数最多的中文分词工具GoJieba,源代码地址:GoJieba ,官方文档:GoJieba官方文档

官方介绍

  • 支持多种分词方式,包括: 最大概率模式, HMM新词发现模式, 搜索引擎模式, 全模式
  • 核心算法底层由C++实现,性能高效。
  • 无缝集成到 Bleve 到进行搜索引擎的中文分词功能。
  • 字典路径可配置,NewJieba(...string), NewExtractor(...string) 可变形参,当参数为空时使用默认词典(推荐方式)

模式扩展

  • 精确模式:将句子精确切开,适合文本字符分析
  • 全模式:把短语中所有的可以组成词语的部分扫描出来,速度非常快,会有歧义
  • 搜索引擎模式:精确模式基础上,对长词再次切分,提升引擎召回率,适用于搜索引擎分词

主要算法

  • 前缀词典实现高效的词图扫描,生成句子中汉字所有可能出现成词情况所构成的有向无环图(DAG)
  • 采用动态规划查找最大概率路径,找出基于词频最大切分组合
  • 对于未登录词,采用汉字成词能力的HMM模型,采用Viterbi算法计算
  • 基于Viterbi算法做词性标注
  • 基于TF-IDFTextRank模型抽取关键词

编码实现

package main

import (
"fmt"
"github.com/yanyiwu/gojieba"
"strings"
) func main() { var seg = gojieba.NewJieba()
defer seg.Free()
var useHmm = true
var separator = "|" var resWords []string
var sentence = "万里长城万里长" resWords = seg.CutAll(sentence)
fmt.Printf("%s\t全模式:%s \n", sentence, strings.Join(resWords, separator)) resWords = seg.Cut(sentence, useHmm)
fmt.Printf("%s\t精确模式:%s \n", sentence, strings.Join(resWords, separator)) var addWord = "万里长"
seg.AddWord(addWord)
fmt.Printf("添加新词:%s\n", addWord) resWords = seg.Cut(sentence, useHmm)
fmt.Printf("%s\t精确模式:%s \n", sentence, strings.Join(resWords, separator)) sentence = "北京鲜花速递"
resWords = seg.Cut(sentence, useHmm)
fmt.Printf("%s\t新词识别:%s \n", sentence, strings.Join(resWords, separator)) sentence = "北京鲜花速递"
resWords = seg.CutForSearch(sentence, useHmm)
fmt.Println(sentence, "\t搜索引擎模式:", strings.Join(resWords, separator)) sentence = "北京市朝阳公园"
resWords = seg.Tag(sentence)
fmt.Println(sentence, "\t词性标注:", strings.Join(resWords, separator)) sentence = "鲁迅先生"
resWords = seg.CutForSearch(sentence, !useHmm)
fmt.Println(sentence, "\t搜索引擎模式:", strings.Join(resWords, separator)) words := seg.Tokenize(sentence, gojieba.SearchMode, !useHmm)
fmt.Println(sentence, "\tTokenize Search Mode 搜索引擎模式:", words) words = seg.Tokenize(sentence, gojieba.DefaultMode, !useHmm)
fmt.Println(sentence, "\tTokenize Default Mode搜索引擎模式:", words) word2 := seg.ExtractWithWeight(sentence, 5)
fmt.Println(sentence, "\tExtract:", word2) return
}

运行结果

go build -o gojieba 

time ./gojieba 

万里长城万里长  全模式:万里|万里长城|里长|长城|万里|里长
万里长城万里长 精确模式:万里长城|万里|长
添加新词:万里长
万里长城万里长 精确模式:万里长城|万里长
北京鲜花速递 新词识别:北京|鲜花|速递
北京鲜花速递 搜索引擎模式: 北京|鲜花|速递
北京市朝阳公园 词性标注: 北京市/ns|朝阳/ns|公园/n
鲁迅先生 搜索引擎模式: 鲁迅|先生
鲁迅先生 Tokenize Search Mode 搜索引擎模式: [{鲁迅 0 6} {先生 6 12}]
鲁迅先生 Tokenize Default Mode搜索引擎模式: [{鲁迅 0 6} {先生 6 12}]
鲁迅先生 Extract: [{鲁迅 8.20023407859} {先生 5.56404756434}] real 0m1.746s
user 0m1.622s
sys 0m0.124s

性能评测

语言 源码 耗时
C++版本 CppJieba 7.5 s
Golang版本 GoJieba 9.11 s
Python版本 Jieba 88.7 s

计算分词过程的耗时,不包括加载词典耗时,CppJieba性能是GoJieba的1.2倍。CppJieba性能详见jieba-performance-comparison,GoJieba由于是C++开发的CppJieba,性能方面仅次于CppJieba,如果追求性能还是可以考虑的。

Go语言 中文分词技术使用技巧(一)的更多相关文章

  1. NLP+词法系列(二)︱中文分词技术简述、深度学习分词实践(CIPS2016、超多案例)

    摘录自:CIPS2016 中文信息处理报告<第一章 词法和句法分析研究进展.现状及趋势>P4 CIPS2016 中文信息处理报告下载链接:http://cips-upload.bj.bce ...

  2. 深入浅出Hadoop Mahout数据挖掘实战(算法分析、项目实战、中文分词技术)

    Mahout简介 Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目, 提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建 ...

  3. Python 自然语言处理(1)中文分词技术

    中文分词技术 中文自动分词可主要归纳为“规则分词”“统计分词”和“混合分词”,规则分词主要是通过人工设立词库,按照一定方式进行匹配切分,实现简单高效,但对新词很难进行处理,统计分词能够较好应对新词发现 ...

  4. R语言中文分词包jiebaR

    R语言中文分词包jiebaR R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据 ...

  5. NLP+词法系列(一)︱中文分词技术小结、几大分词引擎的介绍与比较

    笔者想说:觉得英文与中文分词有很大的区别,毕竟中文的表达方式跟英语有很大区别,而且语言组合形式丰富,如果把国外的内容强行搬过来用,不一样是最好的.所以这边看到有几家大牛都在中文分词以及NLP上越走越远 ...

  6. NLP第3章 中文分词技术

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

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

  8. 基于Deep Learning的中文分词尝试

    http://h2ex.com/1282 现有分词介绍 自然语言处理(NLP,Natural Language Processing)是一个信息时代最重要的技术之一,简单来讲,就是让计算机能够理解人类 ...

  9. 基于规则的中文分词 - NLP中文篇

    之前在其他博客文章有提到如何对英文进行分词,也说后续会增加解释我们中文是如何分词的,我们都知道英文或者其他国家或者地区一些语言文字是词与词之间有空格(分隔符),这样子分词处理起来其实是要相对容易很多, ...

随机推荐

  1. Java第一节课考试

    1 package kaoshi; import java.util.Scanner; public class ScoreInformation { Scanner input=new Scanne ...

  2. BJDCTF

    python3的模板注入 非常简单...就是直接执行命令就行..虽然过滤了flag,但是拼接下就好了.... payload: http://fd5883ee-b8e2-4bf1-88af-33936 ...

  3. 内置函数---filter和map

    filter filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回 ...

  4. 在一台Linux服务器上安装多个MySQL实例(一)--使用mysqld_multi方式

    (一)MySQL多实例概述 实例是进程与内存的一个概述,所谓MySQL多实例,就是在服务器上启动多个相同的MySQL进程,运行在不同的端口(如3306,3307,3308),通过不同的端口对外提供服务 ...

  5. 第十六周Java实验作业

    实验十六  线程技术 实验时间 2017-12-8 1.实验目的与要求 (1) 掌握线程概念: 多线程是进程执行过程中产生的多条执行线索,线程是比进程执行更小的单位. 线程不能独立存在,必须存在于进程 ...

  6. 第十四周java实验作业

    实验十四  Swing图形界面组件 实验时间 20178-11-29 1.实验目的与要求 (1) 掌握GUI布局管理器用法: 在java中的GUI应用 程序界面设计中,布局控制通过为容器设置布局管理器 ...

  7. 凸包问题 Graham Scan

    2020-01-09 15:14:21 凸包问题是计算几何的核心问题,并且凸包问题的研究已经持续了好多年,这中间涌现出了一大批优秀的算法. 凸包问题的最优解法是Graham Scan算法,该算法可以保 ...

  8. MySQL优化之避免索引失效的方法

    在上一篇文章中,通过分析执行计划的字段说明,大体说了一下索引优化过程中的一些注意点,那么如何才能避免索引失效呢?本篇文章将来讨论这个问题. 避免索引失效的常见方法 1.对于复合索引的使用,应按照索引建 ...

  9. coding++:java-HashMap的负载因子为什么默认是0.75?

    本篇文章基于JDK1.8,特在此说明 1):负载因子的作用 负载因子是和扩容机制有关的,意思是如果当前容器的容量,达到了我们设定的最大值,就要开始执行扩容操作.举个例子来解释,避免小白听不懂: 比如说 ...

  10. 使用内部枚举类作为外部类的参数的Mybatis的参数该如何判断

    新写了一个接口,期望根据不同的参数来给数据库中不同的字段进行传值.这里使用了内部静态枚举类的方式进行传值,在写mybatis动态sql时,如果是普通对象,一般使用,那么使用枚举类,如何判断枚举类的值呢 ...