精华内容
下载资源
问答
  • 中文分词

    2017-09-26 10:50:20
    中文分词



    Genius是一个开源的python中文分词组件,采用 CRF(Conditional Random Field)条件随机场算法。

    https://github.com/duanhongyi/genius


    序列标签:

    https://github.com/guillaumegenthial/sequence_tagging



    Bidirectional LSTM-CRF for Sequence Labeling. Easy-to-use and state-of-the-art performance.

    https://github.com/Hironsan/anago


    LSTM-CRF models for sequence labeling in text.

    https://github.com/abhyudaynj/LSTM-CRF-models



    https://github.com/LiyuanLucasLiu/LM-LSTM-CRF

    展开全文
  • 中文分词 

    千次阅读 2009-10-30 13:31:00
    中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。 现有的分词算法可分为三大类:基于字符串匹配的分词方法...

    中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。

      现有的分词算法可分为三大类:基于字符串匹配的分词方法基于理解的分词方法基于统计的分词方法

      1、基于字符串匹配的分词方法

      这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:

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

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

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

      还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。

      一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。

      对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。

      2、基于理解的分词方法

      这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

      3、基于统计的分词方法

      从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字XY的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点

      到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药材综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题

      分词中的难题

      有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。

      1、歧义识别

      歧义是指同样的一句话,可能有两种或者更多的切分方法。例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交叉歧义。像这种交叉歧义十分常见,前面举的“和服”的例子,其实就是因为交叉歧义引起的错误。“化妆和服装”可以分成“化妆 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。

      交叉歧义相对组合歧义来说是还算比较容易处理,组合歧义就必需根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别?

      如果交叉歧义和组合歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓 球拍 了”、也可切分成“乒乓球 拍卖 了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。

      2、新词识别

      新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?

      新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。

      中文分词的应用

      目前在自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的处理方法中文不能直接采用,就是因为中文必需有分词这道工序。中文分词是其他中文信息处理的基础,搜索引擎只是中文分词的一个应用。其他的比如机器翻译(MT)、语音合成、自动分类、自动摘要、自动校对等等,都需要用到分词。因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也是要解决中文分词问题。在中文研究方面,相比外国人来说,中国人有十分明显的优势。

      分词准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。目前研究中文分词的大多是科研院校,清华、北大、哈工大、中科院、北京语言学院、东北大学、IBM研究院、微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量科技以外,几乎没有了。科研院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,看来中文分词技术要想更好的服务于更多的产品,还有很长一段路。

     

    参考: http://baike.baidu.com/view/19109.html?wtp=tt

     

    展开全文
  • 使用hmmlearn中的MultinomialHMM实现中文分词

    数据
    提取码:sodv
      隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来描述一个含有隐含未知参数的马尔可夫过程。其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。

    训练集长这样:
    在这里插入图片描述
      HMM中文分词原理: 对于一个词语,比如“我爱中国”,每个字有都对应的状态:B、M、E、S中的一个。其中B表示开始,M表示中间,E表示结尾,S表示单独一个字。因此上述四个字的隐状态为:“BMME”。
      使用hmmlearn实现中文分词,我们要解决的核心问题就是计算三大矩阵:初始概率矩阵、转移概率矩阵以及发射概率矩阵。

    1. 对于初始概率矩阵,是一个1 X 4维的矩阵,我们用pi表示。pi[0]就是初始时B的概率,后面三个依次类推。怎么算这四个值呢?我们遍历训练集中每一个句子,如果该句子第一个词语长度大于等于2,那说明该句子是以M开头的,则pi[0]++;如果句子开头只有一个字,则pi[3]++。很显然,句子开头不可能是M或者E。 遍历完之后,矩阵中每个数再除以所有数之和即可(算概率)。
    2. 对于转义概率矩阵A,是一个4 X 4维的矩阵。比如A[0, 1]表示当前状态时B而下一状态是M的概率。具体计算方法:我们遍历所有句子,对每一个句子,我们找出B后面跟着M的个数,以及B后面跟着E的个数等等。遍历完成之后同样每一行除以该行总和。
    3. 对于发射概率矩阵B是一个4 X 65536(unicode)的矩阵。比如B[3, 25000]表示的意思就是unicode编码为25000的汉字状态为B的概率。计算方式为:遍历训练集中每一个字,利用ord(x)返回编码,如果该字隐状态为B,则B[0, ord(x)]++,以此类推。最后同样每一行除以该行所有数据之和。当然,按理说也可以不用unicode编码,我刚开始是这样做的:找到所有汉字的集合(不重复),大概有25000的样子,然后从0-24999编号。但是这样做的话时间代价很大,直接计算ord(x)显然更快。

    具体步骤:

    1. 数据处理。 读取txt文件,把每一个字的隐状态都表示出来:
    def load_data():
         data = open('HMM/TrainData.txt', encoding='utf-8')
         file = []
         for line in data.readlines():
             file.append(line.strip().split(' '))
         max_len = 0; temp = 0
         res = []
         for i in range(len(file)):
             for j in range(len(file[i])):
                 for k in range(len(file[i][j])):
                     res.append(file[i][j][k])
         real_file = []
         for i in range(len(file)):
             x = []
             for j in range(len(file[i])):
                 if len(file[i][j]) == 1:
                     x.append('S')
                 elif len(file[i][j]) == 2:
                     x.append('BE')
                 else:
                     str = 'B'
                     for k in range(len(file[i][j])-2):
                         str += 'M'
                     str += 'E'
                     x.append(str)
             real_file.append(x)
         return file, real_file
    

    file表示所有词语的集合,是一个二维列表,每个列表表示一句话,每句话又被分成了词语。real_file与file一一对应,只不过是编码BMES的集合。

    1. 计算三大矩阵:
    def hMM():
         file, data = load_data()    #lens表示一个出现了多少个字
         # print(list_set)
         states = ['B', 'M', 'E', 'S']   #分别表示开始中间结尾以及单个字
         A = np.zeros((4, 4))
         B = np.zeros((4, 65536))   #编码表示汉字,不用顺序
         pi = np.zeros(4)     #初始状态
    
         for i in range(len(data)):
             if data[i][0][0] == 'B':  #开头只能是B或者S
                 pi[0] += 1
             if data[i][0][0] == 'S':
                 pi[3] += 1
    
         pi /= np.sum(pi)   #初始状态
    
         for i in range(len(data)):
             for j in range(len(data[i])):
                 for k in range(len(data[i][j])):
                     B[states.index(data[i][j][k]), ord(file[i][j][k])] += 1   #隐状态为data[i][j][k]时对应汉字file[i][j][k]
                 if len(data[i][j]) == 1 and j + 1 < len(data[i]):
                     if data[i][j+1][0] == 'B':  #S后面接B
                         A[3, 0] += 1
                     if data[i][j+1][0] == 'S':  #S后面接S
                         A[3, 3] += 1
                     continue
                 A[0, 1] += data[i][j].count('BM')
                 A[0, 2] += data[i][j].count('BE')
                 A[1, 2] += data[i][j].count('ME')
                 if j + 1 < len(data[i]) and data[i][j + 1][0] == 'B':
                     A[2, 0] += 1
                 if j + 1 < len(data[i]) and data[i][j + 1][0] == 'S':
                     A[2, 3] += 1
    
         for i in range(4):
             if np.sum(A[i]) != 0:
                 A[i] = A[i] / np.sum(A[i])
    
         for i in range(4):
             B[i] /= np.sum(B[i])
    
    1. 训练模型:
    model = hmm.MultinomialHMM(n_components=len(states))
    model.startprob_ = pi
    model.emissionprob_ = B
    model.transmat_ = A
    
    1. 测试。对测试集中每一句话,对其中每一个字找到它的unicode码集合,然后利用上面训练好的模型对该集合进行解码。
    if __name__ == '__main__':
         print('请稍候...')
         model = hMM()
         dataset = []
         data = open('HMM/TestData.txt', 'r+')
         for line in data.readlines():
             temp = line.strip().split('\t')
             file = []
             for x in temp:
                 file.append(x)
             dataset.append(file)   #处理数据
         data = np.array(dataset)
         for k in range(4):    #四句话
             print('分词前:', str(data[k]))
             datas = []
             x = str(*data[k])   #变成字符串
             for j in x:
                 datas.append(ord(j))  #寻找汉字的编码,进行decode
             xd = np.asarray(datas).reshape(-1, 1)
             pre = model.predict(xd)
             final = []
             for p, q in enumerate(pre):
                 if q == 0:
                     t = p
                 elif q == 2:
                     final.append(x[t:p + 1])
                 elif q == 3:
                     final.append(x[p])
             print("分词后:", '/'.join(final))
             print('\n')
    

    完整代码:

    from hmmlearn import hmm
    import numpy as np
    
    def load_data():
         data = open('HMM/TrainData.txt', encoding='utf-8')
         file = []
         for line in data.readlines():
             file.append(line.strip().split(' '))
         max_len = 0; temp = 0
         res = []
         for i in range(len(file)):
             for j in range(len(file[i])):
                 for k in range(len(file[i][j])):
                     res.append(file[i][j][k])
         real_file = []
         for i in range(len(file)):
             x = []
             for j in range(len(file[i])):
                 if len(file[i][j]) == 1:
                     x.append('S')
                 elif len(file[i][j]) == 2:
                     x.append('BE')
                 else:
                     str = 'B'
                     for k in range(len(file[i][j])-2):
                         str += 'M'
                     str += 'E'
                     x.append(str)
             real_file.append(x)
         return file, real_file
    
    
    #训练
    def hMM():
         file, data = load_data()    #lens表示一个出现了多少个字
         # print(list_set)
         states = ['B', 'M', 'E', 'S']   #分别表示开始中间结尾以及单个字
         A = np.zeros((4, 4))
         B = np.zeros((4, 65536))   #编码表示汉字,不用顺序
         pi = np.zeros(4)     #初始状态
    
         for i in range(len(data)):
             if data[i][0][0] == 'B':  #开头只能是B或者S
                 pi[0] += 1
             if data[i][0][0] == 'S':
                 pi[3] += 1
    
         pi /= np.sum(pi)   #初始状态
    
         for i in range(len(data)):
             for j in range(len(data[i])):
                 for k in range(len(data[i][j])):
                     B[states.index(data[i][j][k]), ord(file[i][j][k])] += 1   #隐状态为data[i][j][k]时对应汉字file[i][j][k]
                 if len(data[i][j]) == 1 and j + 1 < len(data[i]):
                     if data[i][j+1][0] == 'B':  #S后面接B
                         A[3, 0] += 1
                     if data[i][j+1][0] == 'S':  #S后面接S
                         A[3, 3] += 1
                     continue
                 A[0, 1] += data[i][j].count('BM')
                 A[0, 2] += data[i][j].count('BE')
                 A[1, 2] += data[i][j].count('ME')
                 if j + 1 < len(data[i]) and data[i][j + 1][0] == 'B':
                     A[2, 0] += 1
                 if j + 1 < len(data[i]) and data[i][j + 1][0] == 'S':
                     A[2, 3] += 1
    
         for i in range(4):
             if np.sum(A[i]) != 0:
                 A[i] = A[i] / np.sum(A[i])
    
         for i in range(4):
             B[i] /= np.sum(B[i])
         #训练模型
         model = hmm.MultinomialHMM(n_components=len(states))
         model.startprob_ = pi
         model.emissionprob_ = B
         model.transmat_ = A
         return model
    
    if __name__ == '__main__':
         print('请稍候...')
         model = hMM()
         dataset = []
         data = open('HMM/TestData.txt', 'r+')
         for line in data.readlines():
             temp = line.strip().split('\t')
             file = []
             for x in temp:
                 file.append(x)
             dataset.append(file)   #处理数据
         data = np.array(dataset)
         for k in range(4):    #四句话
             print('分词前:', str(data[k]))
             datas = []
             x = str(*data[k])   #变成字符串
             for j in x:
                 datas.append(ord(j))  #寻找汉字的编码,进行decode
             xd = np.asarray(datas).reshape(-1, 1)
             pre = model.predict(xd)
             final = []
             for p, q in enumerate(pre):
                 if q == 0:
                     t = p
                 elif q == 2:
                     final.append(x[t:p + 1])
                 elif q == 3:
                     final.append(x[p])
             print("分词后:", '/'.join(final))
             print('\n')
    
    

    输出:

    分词前: ['长春市长春节讲话。']
    分词后: 长春/市长/春节/讲话/。
    
    
    分词前: ['他说的确实在理.']
    分词后:///确实/在理
    
    
    分词前: ['毛主席万岁。']
    分词后: 毛主席///。
    
    
    分词前: ['我有一台电脑。']
    分词后: 我有/一台/电脑/
    展开全文
  • Python中文分词 jieba 十五分钟入门与进阶

    万次阅读 多人点赞 2017-05-27 16:21:04
    整体介绍jieba 基于Python的中文分词工具,安装使用非常方便,直接pip即可,2/3都可以,功能强悍,博主十分推荐 github:https://github.com/fxsjy/jieba 开源中国地址:...

    整体介绍

    jieba 基于Python的中文分词工具,安装使用非常方便,直接pip即可,2/3都可以,功能强悍,博主十分推荐
    github:https://github.com/fxsjy/jieba
    开源中国地址:http://www.oschina.net/p/jieba/?fromerr=LRXZzk9z
    写这篇文章花费两个小时小时,阅读需要十五分钟,读完本篇文章后您将能上手jieba

    下篇博文将介绍将任意中文文本生成中文词云

    同时如果你希望使用其它分词工具,那么你可以留意我之后的博客,我会在接下来的日子里发布其他有关内容.

    三种分词模式与一个参数

    以下代码主要来自于jieba的github,你可以在github下载该源码

    import jieba
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=True, HMM=False)
    print("Full Mode: " + "/ ".join(seg_list))  # 全模式
    
    seg_list = jieba.cut("我来到北京清华大学", cut_all=False, HMM=True)
    print("Default Mode: " + "/ ".join(seg_list))  # 默认模式
    
    seg_list = jieba.cut("他来到了网易杭研大厦", HMM=False)
    print(", ".join(seg_list))
    
    seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", HMM=False)  # 搜索引擎模式
    print(", ".join(seg_list))
    
    # jieba.cut的默认参数只有三个,jieba源码如下
    # cut(self, sentence, cut_all=False, HMM=True)
    # 分别为:输入文本 是否为全模式分词 与是否开启HMM进行中文分词
    

    分词模式的运行结果

    关键词提取

    from os import path
    import jieba.analyse as analyse
    
    d = path.dirname(__file__)
    
    text_path = 'txt/lz.txt' #设置要分析的文本路径
    text = open(path.join(d, text_path)).read()
    
    for key in analyse.extract_tags(text,50, withWeight=False):
    # 使用jieba.analyse.extract_tags()参数提取关键字,默认参数为50
        print key.encode('utf-8')
        # 设置输出编码为utf-8不然在因为win下控制台默认中文字符集为gbk,所以会出现乱码
        # 当withWeight=True时,将会返回number类型的一个权重值(TF-IDF)
    

    提取关键词的运行效果

    运行结果如图所示,但是同样的我们也发现了一些问题,比如:
    问题一:
    分词错误,在运行结果中中"路明非"(龙族男主)被分成了"路明"和"明非"啷个中文词语,这是因为jieba的词库中并不含有该词的原因,同样的原因以及jieba词库比较老,因而在许多文本分词时都会产生这种情况,而这个问题我们将在第五个模块"三种可以让分词更准确的方法"解决
    问题二:
    出现非实意词语,无论在哪种语言中,都会存在大量的非实意单词,这一类词云我们需要在进行中文分词时进行去除停用词,这个问题将在下一个模块中解决

    中文歧义测试与去除停用词

    本段代码主要来自于《机器学习实践指南(第二版))》,其作者为麦好,ps:这是一本好书

    找停用词点这里:多版本中文停用词词表 + 多版本英文停用词词表 + python词表合并程序

    import jieba
    TestStr = "2010年底部队友谊篮球赛结束"
    # 因为在汉语中没有空格进行词语的分隔,所以经常会出现中文歧义,比如年底-底部-部队-队友
    # jieba 默认启用了HMM(隐马尔科夫模型)进行中文分词,实际效果不错
    
    seg_list = jieba.cut(TestStr, cut_all=True)
    print "Full Mode:", "/ ".join(seg_list) # 全模式
    
    seg_list = jieba.cut(TestStr, cut_all=False)
    print "Default Mode:", "/ ".join(seg_list) # 默认模式
    # 在默认模式下有对中文歧义有较好的分类方式
    
    seg_list = jieba.cut_for_search(TestStr) # 搜索引擎模式
    print "cut for Search","/".join(seg_list)
    

    中文歧义测试

    去除文本中的停用词

    # - * - coding: utf - 8 -*-
    #
    # 作者:田丰(FontTian)
    # 创建时间:'2017/5/27'
    # 邮箱:fonttian@163.com
    # CSDN:http://blog.csdn.net/fontthrone
    
    import sys
    import jieba
    from os import path
    
    d = path.dirname(__file__)
    stopwords_path = 'stopwords\stopwords1893.txt' # 停用词词表
    
    text_path = 'txt/lz.txt' #设置要分析的文本路径
    text = open(path.join(d, text_path)).read()
    
    def jiebaclearText(text):
        mywordlist = []
        seg_list = jieba.cut(text, cut_all=False)
        liststr="/ ".join(seg_list)
        f_stop = open(stopwords_path)
        try:
            f_stop_text = f_stop.read( )
            f_stop_text=unicode(f_stop_text,'utf-8')
        finally:
            f_stop.close( )
        f_stop_seg_list=f_stop_text.split('\n')
        for myword in liststr.split('/'):
            if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:
                mywordlist.append(myword)
        return ''.join(mywordlist)
    
    text1 = jiebaclearText(text)
    print text1
    

    龙族中文分词去除中文停用词后的效果

    三种可以让分词更准确的方法

    方案一,在jieba中添加中文词语:
    这种方法可以有效的解决之前龙族男主"路明非"被分为"路明"和"明非"两个词的情况

    #这个只需要在源代码中加入一个语句即可
    import sys
    import jieba
    from os import path
    
    d = path.dirname(__file__)
    stopwords_path = 'stopwords\stopwords1893.txt' # 停用词词表
    
    jieba.add_word('路明非')
    # 添加的自定义中文语句的代码在这里
    # 添加的自定义中文语句的代码在这里
    # 添加的自定义中文语句的代码在这里
    
    text_path = 'txt/lz.txt' #设置要分析的文本路径
    text = open(path.join(d, text_path)).read()
    
    def jiebaclearText(text):
        mywordlist = []
        seg_list = jieba.cut(text, cut_all=False)
        liststr="/ ".join(seg_list)
        f_stop = open(stopwords_path)
        try:
            f_stop_text = f_stop.read( )
            f_stop_text=unicode(f_stop_text,'utf-8')
        finally:
            f_stop.close( )
        f_stop_seg_list=f_stop_text.split('\n')
        for myword in liststr.split('/'):
            if not(myword.strip() in f_stop_seg_list) and len(myword.strip())>1:
                mywordlist.append(myword)
        return ''.join(mywordlist)
    
    text1 = jiebaclearText(text)
    print text1
    

    运行效果如下:
    添加自定义语句之后

    方案二,添加自定义词库:
    下面的代码主要来自于jieba的github源码,你可以在github下载该例子

    #encoding=utf-8
    from __future__ import print_function, unicode_literals
    import sys
    sys.path.append("../")
    import jieba
    jieba.load_userdict("userdict.txt")
    # jieba采用延迟加载,"import jieba"不会立即触发词典的加载,一旦有必要才开始加载词典构建trie。如果你想手工初始jieba,也可以手动初始化。示例如下:
    # import jieba
    # jieba.initialize() #手动初始化(可选)
    # 在0.28之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径:
    # 注意用户词典为主词典即优先考虑的词典,原词典此时变为非主词典
    # jieba.set_dictionary('data/dict.txt.big')
    
    import jieba.posseg as pseg
    
    test_sent = (
    "李小福是创新办主任也是云计算方面的专家; 什么是八一双鹿\n"
    "例如我输入一个带“韩玉赏鉴”的标题,在自定义词库中也增加了此词为N类\n"
    "「台中」正確應該不會被切開。mac上可分出「石墨烯」;此時又可以分出來凱特琳了。"
    )
    words = jieba.cut(test_sent)
    print('/'.join(words))
    
    print("="*40)
    
    result = pseg.cut(test_sent)
    # pseg.cut 切分,并显示词性
    # 下面是userdict.txt的内容,如果不加入这个词库,那么在运行结果中,云计算,创新办等词都将无法识别
    '''
    云计算 5
    李小福 2 nr
    创新办 3 i
    easy_install 3 eng
    好用 300
    韩玉赏鉴 3 nz
    八一双鹿 3 nz
    台中
    凱特琳 nz
    Edu Trust认证 2000
    '''
    
    

    添加用户词典

    下面这段代码主要来自于jieba的github,你可以在github下载该源码

    print('='*40)
    print('添加自定义词典/调整词典')
    print('-'*40)
    
    print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    #如果/放到/post/中将/出错/。
    # 调整词典使 中将 变为中/将
    print(jieba.suggest_freq(('中', '将'), True))
    #494
    print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
    #如果/放到/post/中/将/出错/。
    print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    #「/台/中/」/正确/应该/不会/被/切开
    print(jieba.suggest_freq('台中', True))
    print(jieba.suggest_freq('台中', True))
    #69
    # 调整词典使 台中 不被分词为台/中
    print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
    #「/台中/」/正确/应该/不会/被/切开
    

    并行计算

    下面这段代码主要来自于jieba的github,你可以在github下载该源码

    原理:将目标文本按行分隔后,把各行文本分配到多个python进程并行分词,然后归并结果,从而获得分词速度的可观提升

    基于python自带的multiprocessing模块,目前暂不支持windows

    import sys
    import time
    sys.path.append("../../")
    import jieba
    
    jieba.enable_parallel() # 关闭并行分词
    jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数 
    
    url = sys.argv[1]
    content = open(url,"rb").read()
    t1 = time.time()
    words = "/ ".join(jieba.cut(content))
    
    t2 = time.time()
    tm_cost = t2-t1
    
    log_f = open("1.log","wb")
    log_f.write(words.encode('utf-8'))
    
    print('speed %s bytes/second' % (len(content)/tm_cost))
    

    实验结果:在4核3.4GHz Linux机器上,对金庸全集进行精确分词,获得了1MB/s的速度,是单进程版的3.3倍。

    展开全文
  • 基于python中jieba包的中文分词中详细使用(一)

    万次阅读 多人点赞 2018-05-06 12:43:21
    基于python中jieba包的中文分词中详细使用(一) 01.前言 02.jieba的介绍 02.1 What 02.2特点 02.3安装与使用 02.4涉及到的算法 03.主要功能 03.01分词 03.02添加自定义词典 03.02调整词典 04.结束语 ...
  • ik中文分词词库30万中文分词词库(含电商) ik中文分词词库30万中文分词词库(含电商)
  • 中文分词原理及常用Python中文分词库介绍 转自 进击的Coder 公众号 原理 中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词...
  • 中文分词词库

    热门讨论 2011-10-10 10:57:07
    中文分词词库中文分词词库中文分词词库中文分词词库中文分词词库
  • Java中文分词组件 - word分词

    万次阅读 2019-02-10 16:17:50
    word分词是一个Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。能通过...
  • FreeICTCLAS 中科院中文分词

    千次下载 热门讨论 2009-07-31 20:16:05
    FreeICTCLAS 中科院中文分词 含中科院计算所ICTCLAS2009接口文档
  • 中文分词工具

    2018-05-27 00:52:51
    1、学会使用10大Java开源中文分词器 2、对比分析10大Java开源中文分词器的分词效果 本文给出了10大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,990
精华内容 7,996
关键字:

中文分词