精华内容
下载资源
问答
  • 常用中文分词方法
    千次阅读
    2018-06-12 19:22:06

    一、正向最大匹配FMM

    从左到右将待分词文本中的最多个连续字符与词表匹配,如果匹配上,则切分出一个词。

    二、逆向最大匹配

    从右到左将待分词文本中的最多个连续字符与词表匹配,如果匹配上,则切分出一个词。

    三、双向最大匹配

    正向最大匹配算法和逆向最大匹配算法.如果两个算法得到相同的分词结果,那就认为是切分成功,否则,就出现了歧义现象或者是未登录词问题。

    四、N-gram双向最大匹配

    基于字符串的分词方法中的正向最大匹配算法和逆向最大匹配算法。然后对两个方向匹配得出的序列结果中不同的部分运用Bi-gram计算得出较大概率的部分。最后拼接得到最佳词序列。

    五、HMM分词

    序列标注

    B:起始词

    M:中间词

    E:结束词

    S:单独的词

    比如:

    ['现在', '', '财政', '', '', '90%', '来自', '乡镇企业', '']

    ['B', 'E', 'S', 'B', 'E', 'S', 'S', 'B', 'M', 'E', 'B', 'E', 'B', 'M', 'M', 'E', 'S']


    更多相关内容
  • nlp--常用分词方法

    千次阅读 2022-03-17 11:52:11
    本文以介绍 nlp 常见分词方法为目的,具体效果请大家自行辨别 中文分词 jieba 代码 jieba.enable_paddle() # 启动paddle模式。 0.40版之后开始支持,早期版本不支持 seg_list = jieba.cut(data, use_paddle=True)...

    前言

    本文以介绍 nlp 常见分词方法为目的,具体效果请大家自行辨别

    中文分词

    jieba

    • 代码

      jieba.enable_paddle()  # 启动paddle模式。 0.40版之后开始支持,早期版本不支持
          seg_list = jieba.cut(data, use_paddle=True)  # 使用paddle模式
          print("Paddle Mode: " + '/'.join(list(seg_list)))
      
          seg_list = jieba.cut(data, cut_all=True)
          print("Full Mode: " + "/ ".join(seg_list))  # 全模式
      
          seg_list = jieba.cut(data, cut_all=False)
          print("Default Mode: " + "/ ".join(seg_list))  # 精确模式
      
          seg_list = jieba.cut_for_search(data)  # 搜索引擎模式
          print("Search Mode: " + "/ ".join(seg_list))
      

    自定义词典

    央视
    神丹牌
    莲田牌
    土鸡蛋
    新京报
    湖北神丹健康食品有限公司
    龙头企业
    315晚会
    
    • 新增代码

      jieba.load_userdict("../exp2/Userdict.txt")
      

    详情见github

    SnowNLP

    • 代码

      def snow_nlp(data):
          s = SnowNLP(data)
          print(s.words)
          print(s.pinyin)
      

    详情见github

    THULAC

    • 代码

      def thulac_nlp(data):
          thu1 = thulac.thulac()  # 默认模式
          text = thu1.cut(data, text=True)  # 进行一句话分词
          print(text)
      

    详情见github

    NLPIR

    • 代码

      def pynlpir_nlp(data):
          pynlpir.open()
          ans = pynlpir.segment(data)
          print(ans)
      

    详情见githubCSDN

    StanfordCoreNLP

    • 代码

      def stanford_nlp(data):
          # _*_coding:utf-8_*_
          with StanfordCoreNLP(r'D:\stanford-corenlp-full-2018-02-27', lang='zh') as nlp:
              print(nlp.word_tokenize(data))
      

    详情见github

    英文分词

    NLTK

    • 代码

      def nltk_nlp(data):
          ans = nltk.word_tokenize(data)
          print(ans)
      

    详情见nltk.orggithub简书

    Spacy

    • 代码

      def spacy_nlp(data):
          nlp = spacy.load("en_core_web_sm")
          doc = nlp(data)
          ans = [token.text for token in doc]
          print(ans)
      

    详情见csdnspacy.io

    StanfordCoreNLP

    • 代码

      def stanford_nlp(data):
          # _*_coding:utf-8_*_
          with StanfordCoreNLP(r'D:\stanford-corenlp-full-2018-02-27') as nlp:
              print(nlp.word_tokenize(data))
      

    详情见github

    常见问题

    问题一

    • 问题:在尝试使用StanfordCoreNLP进行中文分词时,发生了报错现象。报错信息为编码不正确,使用的为4.4.0版本。

    • 解决:怀疑是Python版本与StanfordCoreNLP版本不匹配引发的错误。github仓库中提供的版本对应表Python版本最低到3.7,而我使用的是3.6版本。之后尝试StanfordCoreNLP-3.7.0版本,但分词结果全为空。最后更改到StanfordCoreNLP-3.9.1版本(尝试了github仓库中提供样例使用的版本),得到正确的结果

      Py VersionCoreNLP Version
      v3.7.0.1 v3.7.0.2CoreNLP 3.7.0
      v3.8.0.1CoreNLP 3.8.0
      v3.9.1.1CoreNLP 3.9.1

    问题二

    • 问题:在尝试使用Spacy进行英文分词时,加载模型使用spacy.load("en"),被告知,该方法已经被抛弃,建议使用spacy.load("en_core_web_sm")。之后,使用spacy.load("en_core_web_sm"),被告知找不到模型en_core_web_sm
    • 解决:python -m spacy download en_core_web_sm大概率是不会成功的,我也确实没有通过这种方式成功安装。直接从github上下载,然后使用命令pip install en_core_web_sm-2.3.0.tar.gz进行安装,即可成功安装
    • 详见Spacy问题的解决
    展开全文
  • 列举了当前常用中文分词器及其地址链接,不用再进行网络查找,直接可以进行使用。
  • 转自 进击的Coder 公众号原理中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,...

    转自 进击的Coder 公众号

    原理

    中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,同时分词的背后其实是涉及各种各样的算法的。

    中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为切分。根据其特点,可以把分词算法分为四大类:

    基于规则的分词方法

    基于统计的分词方法

    基于语义的分词方法

    基于理解的分词方法

    下面我们对这几种方法分别进行总结。

    基于规则的分词方法

    这种方法又叫作机械分词方法、基于字典的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。文本的扫描顺序有正向扫描、逆向扫描和双向扫描。匹配原则主要有最大匹配、最小匹配、逐词匹配和最佳匹配。

    最大匹配法(MM)。基本思想是:假设自动分词词典中的最长词条所含汉字的个数为 i,则取被处理材料当前字符串序列中的前i个字符作为匹配字段,查找分词词典,若词典中有这样一个i字词,则匹配成功,匹配字段作为一个词被切分出来;若词典中找不到这样的一个i字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的字符作为新的匹配字段,再进行匹配,如此进行下去,直到匹配成功为止。统计结果表明,该方法的错误率为 1/169.

    逆向最大匹配法(RMM)。该方法的分词过程与 MM 法相同,不同的是从句子(或文章)末尾开始处理,每次匹配不成功时去掉的是前面的一个汉字。统计结果表明,该方法的错误率为 1/245。

    逐词遍历法。把词典中的词按照由长到短递减的顺序逐字搜索整个待处理的材料,一直到把全部的词切分出来为止。不论分词词典多大,被处理的材料多么小,都得把这个分词词典匹配一遍。

    设立切分标志法。切分标志有自然和非自然之分。自然切分标志是指文章中出现的非文字符号,如标点符号等;非自然标志是利用词缀和不构成词的词(包 括单音词、复音节词以及象声词等)。设立切分标志法首先收集众多的切分标志,分词时先找出切分标志,把句子切分为一些较短的字段,再用 MM、RMM 或其它的方法进行细加工。这种方法并非真正意义上的分词方法,只是自动分词的一种前处理方式而已,它要额外消耗时间扫描切分标志,增加存储空间存放那些非 自然切分标志。

    最佳匹配法(OM)。此法分为正向的最佳匹配法和逆向的最佳匹配法,其出发点是:在词典中按词频的大小顺序排列词条,以求缩短对分词词典的检索时 间,达到最佳效果,从而降低分词的时间复杂度,加快分词速度。实质上,这种方法也不是一种纯粹意义上的分词方法,它只是一种对分词词典的组织方式。OM 法的分词词典每条词的前面必须有指明长度的数据项,所以其空间复杂度有所增加,对提高分词精度没有影响,分词处理的时间复杂度有所降低。

    此种方法优点是简单,易于实现。但缺点有很多:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。

    基于统计的分词方法

    该方法的主要思想:词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。

    该方法所应用的主要的统计模型有:N 元文法模型(N-gram)、隐马尔可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、条件随机场模型(Conditional Random Fields,CRF)等。

    在实际应用中此类分词算法一般是将其与基于词典的分词方法结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

    基于语义的分词方法

    语义分词法引入了语义分析,对自然语言自身的语言信息进行更多的处理,如扩充转移网络法、知识分词语义分析法、邻接约束法、综合匹配法、后缀分词法、特征词库法、矩阵约束法、语法分析法等。

    扩充转移网络法。该方法以有限状态机概念为基础。有限状态机只能识别正则语言,对有限状态机作的第一次扩充使其具有递归能力,形成递归转移网络 (RTN)。在RTN 中,弧线上的标志不仅可以是终极符(语言中的单词)或非终极符(词类),还可以调用另外的子网络名字分非终极符(如字或字串的成词条件)。这样,计算机在 运行某个子网络时,就可以调用另外的子网络,还可以递归调用。词法扩充转移网络的使用, 使分词处理和语言理解的句法处理阶段交互成为可能,并且有效地解决了汉语分词的歧义。

    矩阵约束法。其基本思想是:先建立一个语法约束矩阵和一个语义约束矩阵, 其中元素分别表明具有某词性的词和具有另一词性的词相邻是否符合语法规则, 属于某语义类的词和属于另一词义类的词相邻是否符合逻辑,机器在切分时以之约束分词结果。

    基于理解的分词方法

    基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。

    专家系统分词法。从专家系统角度把分词的知识(包括常识性分词知识与消除歧义切分的启发性知识即歧义切分规则)从实现分词过程的推理机中独立出来,使知识库的维护与推理机的实现互不干扰,从而使知识库易于维护和管理。它还具有发现交集歧义字段和多义组合歧义字段的能力和一定的自学习功能。

    神经网络分词法。该方法是模拟人脑并行,分布处理和建立数值计算模型工作的。它将分词知识所分散隐式的方法存入神经网络内部,通过自学习和训练修改内部权值,以达到正确的分词结果,最后给出神经网络自动分词结果,如使用 LSTM、GRU 等神经网络模型等。

    神经网络专家系统集成式分词法。该方法首先启动神经网络进行分词,当神经网络对新出现的词不能给出准确切分时,激活专家系统进行分析判断,依据知识库进行推理,得出初步分析,并启动学习机制对神经网络进行训练。该方法可以较充分发挥神经网络与专家系统二者优势,进一步提高分词效率。

    以上便是对分词算法的基本介绍,接下来我们再介绍几个比较实用的分词 Python 库及它们的使用方法。

    分词工具

    在这里介绍几个比较有代表性的支持分词的 Python 库,主要有:

    1. jieba

    专用于分词的 Python 库,GitHub:https://github.com/fxsjy/jieba,分词效果较好。

    支持三种分词模式:

    精确模式,试图将句子最精确地切开,适合文本分析。

    全模式,将句子中所有的可能成词的词语都扫描出来,速度非常快,但是不能解决歧义。

    搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适用于搜索引擎分词。

    另外 jieba 支持繁体分词,支持自定义词典。

    其使用的算法是基于统计的分词方法,主要有如下几种:

    基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)

    采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

    对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

    精确模式分词

    首先我们来看下精确模式分词,使用 lcut() 方法,类似 cut() 方法,其参数和 cut() 是一致的,只不过返回结果是列表而不是生成器,默认使用精确模式,代码如下:

    import jieba

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = jieba.lcut(string)

    print(len(result), '/'.join(result))

    结果:

    38 这个/把手/该换/了/,/我/不/喜欢/日本/和服/,/别/把手/放在/我/的/肩膀/上/,/工信处/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    可见分词效果还是不错的。

    全模式分词

    使用全模式分词需要添加 cut_all 参数,将其设置为 True,代码如下:

    result = jieba.lcut(string, cut_all=True)

    print(len(result), '/'.join(result))

    结果如下:

    51 这个/把手/该换/了///我/不/喜欢/日本/和服///别/把手/放在/我/的/肩膀/上///工信处/处女/女干事/干事/每月/月经/经过/下属/科室/都/要/亲口/口交/交代/24/口交/交换/交换机/换机/等/技术/技术性/性器/器件/的/安装/安装工/装工/工作

    搜索引擎模式分词

    使用搜索引擎模式分词需要调用 cut_for_search() 方法,代码如下:

    result = jieba.lcut_for_search(string)

    print(len(result), '/'.join(result))

    结果如下:

    42 这个/把手/该换/了/,/我/不/喜欢/日本/和服/,/别/把手/放在/我/的/肩膀/上/,/工信处/干事/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换/换机/交换机/等/技术/技术性/器件/的/安装/工作

    另外可以加入自定义词典,如我们想把 日本和服 作为一个整体,可以把它添加到词典中,代码如下:

    jieba.add_word('日本和服')

    result = jieba.lcut(string)

    print(len(result), '/'.join(result))

    结果如下:

    37 这个/把手/该换/了/,/我/不/喜欢/日本和服/,/别/把手/放在/我/的/肩膀/上/,/工信处/女干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    可以看到切分结果中,日本和服 四个字就作为一个整体出现在结果中了,分词数量比精确模式少了一个。

    词性标注

    另外 jieba 还支持词性标注,可以输出分词后每个词的词性,实例如下:

    words = pseg.lcut(string)

    print(list(map(lambda x: list(x), words)))

    运行结果:

    [['这个', 'r'], ['把手', 'v'], ['该', 'r'], ['换', 'v'], ['了', 'ul'], [',', 'x'], ['我', 'r'], ['不', 'd'], ['喜欢', 'v'], ['日本和服', 'x'], [',', 'x'], ['别', 'r'], ['把手', 'v'], ['放在', 'v'], ['我', 'r'], ['的', 'uj'], ['肩膀', 'n'], ['上', 'f'], [',', 'x'], ['工信处', 'n'], ['女干事', 'n'], ['每月', 'r'], ['经过', 'p'], ['下属', 'v'], ['科室', 'n'], ['都', 'd'], ['要', 'v'], ['亲口', 'n'], ['交代', 'n'], ['24', 'm'], ['口', 'n'], ['交换机', 'n'], ['等', 'u'], ['技术性', 'n'], ['器件', 'n'], ['的', 'uj'], ['安装', 'v'], ['工作', 'vn']]

    2. SnowNLP

    SnowNLP: Simplified Chinese Text Processing,可以方便的处理中文文本内容,是受到了 TextBlob 的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和 TextBlob 不同的是,这里没有用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。GitHub地址:https://github.com/isnowfy/snownlp。

    分词

    这里的分词是基于 Character-Based Generative Model 来实现的,论文地址:http://aclweb.org/anthology//Y/Y09/Y09-2047.pdf,我们还是以上面的例子说明,相关使用说明如下:

    from snownlp import SnowNLP

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    s = SnowNLP(string)

    result = s.words

    print(len(result), '/'.join(result))

    运行结果:

    40 这个/把手/该/换/了/,/我/不/喜欢/日本/和/服/,/别把手/放在/我/的/肩膀/上/,/工/信处女/干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    经过观察,可以发现分词效果其实不怎么理想,和服 被分开了,工信处 也被分开了,女干事 也被分开了。

    另外 SnowNLP 还支持很多功能,例如词性标注(HMM)、情感分析、拼音转换(Trie树)、关键词和摘要生成(TextRank)。

    我们简单看一个实例:

    print('Tags:', list(s.tags))

    print('Sentiments:', s.sentiments)

    print('Pinyin:', s.pinyin)

    运行结果:

    Tags: [('这个', 'r'), ('把手', 'Ng'), ('该', 'r'), ('换', 'v'), ('了', 'y'), (',', 'w'), ('我', 'r'), ('不', 'd'), ('喜欢', 'v'), ('日本', 'ns'), ('和', 'c'), ('服', 'v'), (',', 'w'), ('别把手', 'ad'), ('放在', 'v'), ('我', 'r'), ('的', 'u'), ('肩膀', 'n'), ('上', 'f'), (',', 'w'), ('工', 'j'), ('信处女', 'j'), ('干事', 'n'), ('每月', 'r'), ('经过', 'p'), ('下属', 'v'), ('科室', 'n'), ('都', 'd'), ('要', 'v'), ('亲口', 'd'), ('交代', 'v'), ('24', 'm'), ('口', 'q'), ('交换机', 'n'), ('等', 'u'), ('技术性', 'n'), ('器件', 'n'), ('的', 'u'), ('安装', 'vn'), ('工作', 'vn')]

    Sentiments: 0.015678817603646866

    Pinyin: ['zhe', 'ge', 'ba', 'shou', 'gai', 'huan', 'liao', ',', 'wo', 'bu', 'xi', 'huan', 'ri', 'ben', 'he', 'fu', ',', 'bie', 'ba', 'shou', 'fang', 'zai', 'wo', 'de', 'jian', 'bang', 'shang', ',', 'gong', 'xin', 'chu', 'nv', 'gan', 'shi', 'mei', 'yue', 'jing', 'guo', 'xia', 'shu', 'ke', 'shi', 'dou', 'yao', 'qin', 'kou', 'jiao', 'dai', '24', 'kou', 'jiao', 'huan', 'ji', 'deng', 'ji', 'shu', 'xing', 'qi', 'jian', 'de', 'an', 'zhuang', 'gong', 'zuo']

    3. THULAC

    THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,GitHub 链接:https://github.com/thunlp/THULAC-Python,具有中文分词和词性标注功能。THULAC具有如下几个特点:

    能力强。利用集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。

    准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。

    速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

    我们用一个实例看一下分词效果:

    import thulac

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    t = thulac.thulac()

    result = t.cut(string)

    print(result)

    运行结果:

    [['这个', 'r'], ['把手', 'n'], ['该', 'v'], ['换', 'v'], ['了', 'u'], [',', 'w'], ['我', 'r'], ['不', 'd'], ['喜欢', 'v'], ['日本', 'ns'], ['和服', 'n'], [',', 'w'], ['别把手', 'n'], ['放', 'v'], ['在', 'p'], ['我', 'r'], ['的', 'u'], ['肩膀', 'n'], ['上', 'f'], [',', 'w'], ['工信处', 'n'], ['女', 'a'], ['干事', 'n'], ['每月', 'r'], ['经过', 'p'], ['下属', 'v'], ['科室', 'n'], ['都', 'd'], ['要', 'v'], ['亲口', 'd'], ['交代', 'v'], ['24', 'm'], ['口', 'q'], ['交换机', 'n'], ['等', 'u'], ['技术性', 'n'], ['器件', 'n'], ['的', 'u'], ['安装', 'v'], ['工作', 'v']]

    4. NLPIR

    NLPIR 分词系统,前身为2000年发布的 ICTCLAS 词法分析系统,GitHub 链接:https://github.com/NLPIR-team/NLPIR,是由北京理工大学张华平博士研发的中文分词系统,经过十余年的不断完善,拥有丰富的功能和强大的性能。NLPIR是一整套对原始文本集进行处理和加工的软件,提供了中间件处理效果的可视化展示,也可以作为小规模数据的处理加工工具。主要功能包括:中文分词,词性标注,命名实体识别,用户词典、新词发现与关键词提取等功能。另外对于分词功能,它有 Python 实现的版本,GitHub 链接:https://github.com/tsroten/pynlpir。

    使用方法如下:

    import pynlpir

    pynlpir.open()

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = pynlpir.segment(string)

    print(result)

    运行结果如下:

    [('这个', 'pronoun'), ('把', 'preposition'), ('手', 'noun'), ('该', 'pronoun'), ('换', 'verb'), ('了', 'modal particle'), (',', 'punctuation mark'), ('我', 'pronoun'), ('不', 'adverb'), ('喜欢', 'verb'), ('日本', 'noun'), ('和', 'conjunction'), ('服', 'verb'), (',', 'punctuation mark'), ('别', 'adverb'), ('把', 'preposition'), ('手', 'noun'), ('放', 'verb'), ('在', 'preposition'), ('我', 'pronoun'), ('的', 'particle'), ('肩膀', 'noun'), ('上', 'noun of locality'), (',', 'punctuation mark'), ('工', 'noun'), ('信', 'noun'), ('处女', 'noun'), ('干事', 'noun'), ('每月', 'pronoun'), ('经过', 'preposition'), ('下属', 'verb'), ('科室', 'noun'), ('都', 'adverb'), ('要', 'verb'), ('亲口', 'adverb'), ('交代', 'verb'), ('24', 'numeral'), ('口', 'classifier'), ('交换机', 'noun'), ('等', 'particle'), ('技术性', 'noun'), ('器件', 'noun'), ('的', 'particle'), ('安装', 'verb'), ('工作', 'verb')]

    这里 把手 和 和服 也被分开了。

    5. NLTK

    NLTK,Natural Language Toolkit,是一个自然语言处理的包工具,各种多种 NLP 处理相关功能,GitHub 链接:https://github.com/nltk/nltk。

    但是 NLTK 对于中文分词是不支持的,示例如下:

    from nltk import word_tokenize

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = word_tokenize(string)

    print(result)

    结果:

    ['这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作']

    如果要用中文分词的话,可以使用 FoolNLTK,它使用 Bi-LSTM 训练而成,包含分词、词性标注、实体识别等功能,同时支持自定义词典,可以训练自己的模型,可以进行批量处理。

    使用方法如下:

    import fool

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    result = fool.cut(string)

    print(result)

    运行结果:

    [['这个', '把手', '该', '换', '了', ',', '我', '不', '喜欢', '日本', '和服', ',', '别', '把', '手', '放', '在', '我', '的', '肩膀', '上', ',', '工信处', '女', '干事', '每月', '经过', '下属', '科室', '都', '要', '亲', '口', '交代', '24', '口', '交换机', '等', '技术性', '器件', '的', '安装', '工作']]

    可以看到这个分词效果还是不错的。

    另外还可以进行词性标注,实体识别:

    result = fool.pos_cut(string)

    print(result)

    _, ners = fool.analysis(string)

    print(ners)

    运行结果:

    [[('这个', 'r'), ('把手', 'n'), ('该', 'r'), ('换', 'v'), ('了', 'y'), (',', 'wd'), ('我', 'r'), ('不', 'd'), ('喜欢', 'vi'), ('日本', 'ns'), ('和服', 'n'), (',', 'wd'), ('别', 'd'), ('把', 'pba'), ('手', 'n'), ('放', 'v'), ('在', 'p'), ('我', 'r'), ('的', 'ude'), ('肩膀', 'n'), ('上', 'f'), (',', 'wd'), ('工信处', 'ns'), ('女', 'b'), ('干事', 'n'), ('每月', 'r'), ('经过', 'p'), ('下属', 'v'), ('科室', 'n'), ('都', 'd'), ('要', 'v'), ('亲', 'a'), ('口', 'n'), ('交代', 'v'), ('24', 'm'), ('口', 'q'), ('交换机', 'n'), ('等', 'udeng'), ('技术性', 'n'), ('器件', 'n'), ('的', 'ude'), ('安装', 'n'), ('工作', 'n')]]

    [[(12, 15, 'location', '日本')]]

    6. LTP

    语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。

    示例代码如下:

    from pyltp import Segmentor

    string = '这个把手该换了,我不喜欢日本和服,别把手放在我的肩膀上,工信处女干事每月经过下属科室都要亲口交代24口交换机等技术性器件的安装工作'

    segmentor = Segmentor()

    segmentor.load('./cws.model')

    result = list(segmentor.segment(string))

    segmentor.release()

    print(result)

    运行结果:

    41 这个/把手/该/换/了/,/我/不/喜欢/日本/和服/,/别/把/手/放在/我/的/肩膀/上/,/工信/处女/干事/每月/经过/下属/科室/都/要/亲口/交代/24/口/交换机/等/技术性/器件/的/安装/工作

    可以发现 工信处、女干事 没有正确分开。

    以上便是一些分词库的基本使用,个人比较推荐的有 jieba、THULAC、FoolNLTK。

    参考来源

    小结

    我在博客中的每篇文章都是我一字一句敲出来的,转载的文章我也注明了出处,表示对原作者的尊重。同时也希望大家都能尊重我的付出。

    最后,也希望大家关注我的个人博客HD Blog

    谢谢~

    展开全文
  • 分词词库_中文分词词库最新整理(TXT格式)
  • 中文分词方法总结

    2020-09-14 16:17:31
    中文分词方法总结一、基于词典的方法1. 正向最大匹配法(由左到右的方向):2. 逆向最大匹配法(由右到左的方向)3. 最少切分(使每一句中切出的词数最小)二、基于图论的方法1.n-gram切分方法2. 基于条件随机场的方法...

    一、基于词典的方法

    原理:又叫机械分词方法、基于字符串匹配的分词方法。它是按照一定的策略将待分析的字符串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。这是最简单的分词方法,但非常高效和常见。
    常用的基于词典的分词方法如下:

    1. 正向最大匹配法(由左到右的方向):

    如:“达观数据是一家大数据公司”,使用正向最大匹配法分词的结果为“达观/数据是一/家/大数据/公司”

    2. 逆向最大匹配法(由右到左的方向)

    如:使用逆向最大匹配法分词的结果为“达观/数据/是/一家/大数据/公司”

    3. 最少切分(使每一句中切出的词数最小)

    如:最小切分结果为“达观数据/是/一家/大数据公司”。

    • MMSEG机械分词算法
      因为同一个句子,在机械分词中经常会出现多种分词的组合,因此需要进行歧义消除,来得到最优的分词结果。
      以很常见的MMSEG机械分词算法为例,MMSEG在搜索引擎Solr中经常使用到,是一种非常可靠高效的分词算法。

    方法评价:它的速度很快,都是O(n)的时间复杂度,效果也可以。但缺点是对歧义和新词的处理不是很好,对词典中未出现的词没法进行处理,因此经常需要其他分词方法进行协作。

    二、基于图论的方法

    1.n-gram切分方法

    首先根据词典(可以是从训练语料中抽取出来的词典,也可以是外部词典)对句子进行简单匹配,找出所有可能的词典词,然后,将它们和所有单个字作为结点,构造的n元切分词图,图中的结点表示可能的词候选,边表示路径,边上的n元概率表示代价,最后利用相关搜索算法(动态规划)从图中找到代价最小的路径作为最后的分词结果。
    在这里插入图片描述
    可能的切分路径有:
    南京/市/长江/大桥
    南京/市/长江大桥
    南京市/长江/大桥
    南京市/长江大桥
    南京/市长/江/大桥
    南京/市长/江大桥
    南京市长/江/大桥
    南京市长/江大桥

    2. 基于条件随机场的方法(CRF)

    条件随机场(Conditional Random Field,简称CRF)是一种判别式无向图模型,它是随机场的一种,常用于标注或分析序列语料,如自然语言文字或是生物序列。跟隐马尔可夫模型通过联合分布进行建模不同,条件随机场试图对多个变量在给定观测值后的条件概率进行建模。(达观数据 江永青)
    条件随机场分词是一种精度很高的分词方法,它比隐马尔可夫的精度要高,是因为隐马尔可夫假设观察变量xi只与当前状态yi有关,而与其它状态yi-1,yi+1无关;而条件随机场假设了当前观察变量xi与上下文相关,如 ,就是考虑到上一个字标记状态为B时,当前标记状态为E并且输出“国”字的概率。因此通过上下文的分析,条件随机场分词会提升到更高的精度。但因为复杂度比较高,条件随机场一般训练代价都比较大

    三、基于隐马尔可夫模型(HMM)的方法

    1. 定义:隐马尔可夫模型(Hidden Markov Model,简称HMM)是结构最简单的动态贝叶斯网络(dynamic Bayesian network),这是一种尤其著名的有向图模型,主要用于时序数据建模,在语音识别、自然语言处理等领域有广泛应用。在分词算法中,隐马尔可夫经常用作能够发现新词的算法,通过海量的数据学习,能够将人名、地名、互联网上的新词等一一识别出来,具有广泛的应用场景。(达观数据 江永青)
    2. 解释:
    • 一个HMM可以记作一个五元组u=(S, K, A, B, π), 其中S是状态集合,K是输出符号也就是观察集合,A是状态转移概率,B是符号发射概率,π是初始状态的概率分布。HMM主要解决三个基本问题:
      (1)估计问题,给定一个观察序列O=O1,O2,O3,… ,Ot和模型u=(A,B,π),计算观察序列的概率;
      (2)序列问题,给定一个观察序列O=O1,O2,O3… Ot和模型μ=(A, B, π),计算最优的状态序列Q=q1,q2,q3…qt;
      (3)参数估计问题,给定一个观察序列O=O1,O2,O3… Ot,如何调节模型μ=(A,B, π)的参数,使得P(O|μ)最大。

    • 隐马尔可夫的估计问题可以通过前向/后向的动态规划算法来求解;序列问题可以通过viterbi算法求解;参数估计问题可以通过EM算法求解。通过海量的语料数据,可以方便快速地学习出HMM图模型。

    • 隐马尔可夫的三大问题分别对应了分词中的几个步骤。参数估计问题即是分词的学习阶段,通过海量的语料数据来学习归纳出分词模型的各个参数。状态序列问题是分词的执行阶段,通过观察变量(即待分词句子的序列)来预测出最优的状态序列(分词结构)。
      我们设定状态值集合S =(B, M, E, S),分别代表每个状态代表的是该字在词语中的位置,B代表该字是词语中的起始字,M代表是词语中的中间字,E代表是词语中的结束字,S则代表是单字成词;观察值集合K =(所有的汉字);则中文分词的问题就是通过观察序列来预测出最优的状态序列。

    • 比如观察序列为:
      O = 小红就职于达观数据
      预测的状态序列为:
      Q = BEBESBMME
      根据这个状态序列我们可以进行切词:
      BE/BE/S/BMME/
      所以切词结果如下:
      小红/就职/于/达观数据/

    • 因为HMM分词算法是基于字的状态(BEMS)来进行分词的,因此很适合用于新词发现,某一个新词只要标记为如“BMME”,就算它没有在历史词典中出现过,HMM分词算法也能将它识别出来。

    四、分词的难点

    1. 歧义识别
    2. 新词发现
    展开全文
  • 常用分词方法总结分析

    万次阅读 2015-01-28 18:19:20
    最近对自然语言处理中常见任务的方法做了一下整理总结,并对不同方法做了一些对比分析,资料主要来源于网络以及相关的论文。 1.中文分词 中文句子是由字组成的连续字符串。为了理解中文语义,首先需要将句子划分为...
  • NLP(1) | 词向量one hot编码词向量编码思想 分词的概念 简单来说就是把词进行分开,分词的难点: 1.如何避免歧义,如:“白开水不如果汁甜”。如何让机器避免将“如果”分到一起。...分词方法分类 基于...
  • 中文分词

    2018-11-04 21:09:44
         转自:...基于CRF(Conditional Random Field)分词算法 论文链接:http://nlp.stanford.edu/pubs/sighan2005....
  • 中文分词就是将一句话分解成一个词一个词,英文中可以用空格来做,而中文需要用一些技术...此类型中常用的几种分词方法有:1. 正向最大匹配法:假设词典中最大词条所含的汉字个数为n个,取待处理字符串的前n个字作为...
  • 中文分词常用停用词 文档
  • 常用中文分词软件

    千次阅读 2019-02-24 15:19:30
    SCWS:基于词频词典的机械中文分词引擎 ICTCLAS:最早的中文开源分词项目 HTTPCWS:基于http协议的开源中文分词系统,将取代之前的PHPCWS中文分词扩展 庖丁解牛分词:仅支持Java语言,且提供lucence(一款流行的Java...
  • 本篇文章给大家分享的内容是三种常用的python中文分词工具,有着一定的参考价值,有需要的朋友可以参考一下这三种分词工具,在这里分享下~1.jieba 分词: # -*- coding: UTF-8 -*-import osimport codecsimport ...
  • 与基于理解的分词算法和基于统计的分词算法相比,基于文本匹配的算法更加通用。... 常用的几种机械分词方法如下:  1) 正向最大匹配法(由左到右的方向)  2) 逆向最大匹配法(由右到左的方向)
  • 常用中文分词

    2015-12-11 17:38:35
    分词器: 1、word分词器 2、ansj分词器 3、mmseg4j分词器 4、ik-analyzer分词器 5、jcseg分词器 6、fudannlp分词器 7、smartcn分词器 8、jieba分词器 9、stanford分词器 10、hanlp分词器   测试评估...
  • 常见的中文分词方法

    千次阅读 2018-08-28 19:53:32
    常见的中文分词方法 1.基于规则的方法(字符串匹配、机械分词)     定义:按照一定规则将待分析的汉字串与词典中的词条进行匹配,找到则切分,否则不予...
  • 中文分词常见方法

    万次阅读 2019-07-24 10:25:33
    中文分词中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块。不同于英文的是,中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词分词效果将直接影响词性、句法树等模块...
  • 常用中文分词工具介绍

    千次阅读 2018-12-20 17:12:14
    本文首先介绍下中文分词的基本原理,然后介绍下国内比较流行的中文分词工具,如jieba、SnowNLP、THULAC、NLPIR,上述分词工具都已经在...中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个...
  • 基于规则的中文分词方法

    千次阅读 2019-09-30 10:24:27
    目前,常见的中文分词方法可以分为三类: 基于字典、词库匹配的分词方法(基于规则)。这种方法是将待分的句子与一个充分大的词典中的词语进行匹配。常用的有:正向最大匹配,逆向最大匹配,最少切分法。实际应用中,...
  • 这篇文章主要来介绍下什么是 Analysis ,什么是分词器,以及 ElasticSearch 自带的分词器是怎么工作的,最后会介绍下中文分词是怎么做的。 首先来说下什么是 Analysis: 什么是 Analysis 顾名思义,文本分析就是把...
  • 分词方法

    2017-02-26 15:51:17
    一、分类 1、基于词表的分词方法 2、基于统计模型的分词方法 3、基于规则的方法
  • 常见的中文分词器和使用 在上一章介绍了几种默认的分词器的规则和使用,有兴趣的可以参考一下 elasticSearch核心概念的介绍(五):分词器的介绍和使用 在这一章我们介绍常见的中文分词器 为什么要使用中文分词器...
  • 中文分词方法

    2019-08-14 09:38:42
    中文分词主要有两个类别:本别是基于字词典分词算法和基于统计的机器学习算法,下面依次介绍这两种方法。 1 基于词典分词算法        也称字符串匹配分词算法。该算法是按照一定...
  • 中文分词常用方法简述

    千次阅读 2017-10-11 00:00:00
    中文分词就是将一句话分解成一个词一个词,英文中可以用空格来做,而中文需要用一些技术来...此类型中常用的几种分词方法有:1. 正向最大匹配法:假设词典中最大词条所含的汉字个数为n个,取待处理字符串的前n个字作为
  • 列举出常用汉字3550个,还有生僻字
  • 最近对自然语言处理中常见任务的方法做了一下整理总结,并对不同方法做了一些对比分析,资料主要来源于网络以及相关的论文。1.中文分词中文句子是由字组成的连续字符串。为了理解中文语义,首先需要将句子划分为以词...
  • 中文分词方法

    2021-04-13 16:07:03
    中文分词方法 ** 中文分词是中文文本处理的一个基础步骤,也是中文人机自然语言交互的基础模块。不同于英文的是,中文句子中没有词的界限,因此在进行中文自然语言处理时,通常需要先进行分词,分词效果将直接影响...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,406
精华内容 8,162
关键字:

常用中文分词方法