利用结巴分词进行中文分词,选择全模式,建立词倒排索引,并实现一般多词查询和短语查询

# -*- coding: utf-8 -*-
import jieba
'''
Created on 2015-11-23
'''def word_split(text):"""Split a text in words. Returns a list of tuple that contains(word, location) location is the starting byte position of the word."""word_list = []windex = 0word_primitive = jieba.cut(text, cut_all = True)for word in word_primitive:if len(word) > 0:word_list.append((windex, word))windex += 1return word_listdef inverted_index(text):"""Create an Inverted-Index of the specified text document.{word:[locations]}"""inverted = {}for index, word in word_split(text):locations = inverted.setdefault(word, [])locations.append(index)return inverteddef inverted_index_add(inverted, doc_id, doc_index):"""Add Invertd-Index doc_index of the document doc_id to the Multi-Document Inverted-Index (inverted), using doc_id as document identifier.{word:{doc_id:[locations]}}"""for word, locations in doc_index.iteritems():indices = inverted.setdefault(word, {})indices[doc_id] = locationsreturn inverteddef search_a_word(inverted, word):"""search one word"""   word = word.decode('utf-8')if word not in inverted:return Noneelse:word_index = inverted[word]return word_indexdef search_words(inverted, wordList):"""search more than one word"""wordDic = []docRight = []for word in wordList:if isinstance(word, str):word = word.decode('utf-8')if word not in inverted:return Noneelse:element = inverted[word].keys()element.sort()wordDic.append(element)numbers = len(wordDic)inerIndex = [0 for i in range(numbers)]docIndex = [wordDic[i][0] for i in range(numbers)]flag = Truewhile flag:if min(docIndex) == max(docIndex):docRight.append(min(docIndex))inerIndex = [inerIndex[i]+1 for i in range(numbers)]for i in range(numbers):if inerIndex[i] >= len(wordDic[i]):flag = Falsereturn docRightdocIndex = [wordDic[i][inerIndex[i]] for i in range(numbers)]else:minIndex = min(docIndex)minPosition = docIndex.index(minIndex)inerIndex[minPosition] += 1if inerIndex[minPosition] >= len(wordDic[minPosition]):flag = Falsereturn docRightdocIndex = [wordDic[i][inerIndex[i]] for i in range(numbers)]def search_phrase(inverted, phrase):"""search phrase"""docRight = {}temp = word_split(phrase)wordList = [temp[i][1] for i in range(len(temp))]docPossible = search_words(inverted, wordList)for doc in docPossible:wordIndex = []indexRight = []for word in wordList:wordIndex.append(inverted[word][doc])numbers = len(wordList)inerIndex = [0 for i in range(numbers)]words = [wordIndex[i][0] for i in range(numbers)]flag = Truewhile flag:if words[-1] - words[0] == numbers - 1:indexRight.append(words[0])inerIndex = [inerIndex[i]+1 for i in range(numbers)]for i in range(numbers):if inerIndex[i] >= len(wordIndex[i]):flag = FalsedocRight[doc] = indexRightbreakif flag:words = [wordIndex[i][inerIndex[i]] for i in range(numbers)]else:minIndex = min(words)minPosition = words.index(minIndex)inerIndex[minPosition] += 1if inerIndex[minPosition] >= len(wordIndex[minPosition]):flag = Falsebreakif flag:words = [wordIndex[i][inerIndex[i]] for i in range(numbers)]return docRightif __name__ == '__main__':doc1 = """
中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范
重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文
只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样
存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。
"""doc2 = """
存在中文分词技术,是由于中文在基本文法上有其特殊性,具体表现在:
与英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,
词语之间没有分隔。 古代汉语中除了连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词
书写的必要。而现代汉语中双字或多字词居多,一个字不再等同于一个词。
在中文里,“词”和“词组”边界模糊
现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和
短语的边界很难去区分。
例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准,
同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现
混乱,难度很大。
中文分词的方法其实不局限于中文应用,也被应用到英文处理,如手写识别,单词之间的空格就不很清楚,
中文分词方法可以帮助判别英文单词的边界。
"""doc3 = """
作用
中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,
但如何让计算机也能理解?其处理过程就是分词算法。
影响
中文分词对于搜索引擎来说,最重要的并不是找到所有结果,因为在上百亿的网页中找到所有结果没有太多的意义,
没有人能看得完,最重要的是把最相关的结果排在最前面,这也称为相关度排序。中文分词的准确与否,常常直接
影响到对搜索结果的相关度排序。从定性分析来说,搜索引擎的分词算法不同,词库的不同都会影响页面的返回结果
"""doc4 = """
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,
若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向
匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;常用的几种
机械分词方法如下:
正向最大匹配法(由左到右的方向);
逆向最大匹配法(由右到左的方向);
最少切分(使每一句中切出的词数最小);
双向最大匹配法(进行由左到右、由右到左两次扫描)
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。
由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于
正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为,单纯使用逆向
最大匹配的错误率为。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词
作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征
的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法
是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词
结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
"""doc5 = """
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。
因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度
进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字的相邻共现概率。互现信息体现了
汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法
只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法
也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、
“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本
的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,
既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
另外一类是基于统计机器学习的方法。首先给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律
(称为训练),从而实现对未知文本的切分。我们知道,汉语中各个字单独作词语的能力是不同的,此外有的字常
常作为前缀出现,有的字却常常作为后缀(“者”“性”),结合两个字相临时是否成词的信息,这样就得到了许多
与分词有关的知识。这种方法就是充分利用汉语组词的规律来分词。这种方法的最大缺点是需要有大量预先分好词
的语料作支撑,而且训练过程中时空开销极大。
到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法
来实现,都需要综合不同的算法。例如,海量科技的分词算法就采用“复方分词法”,所谓复方,就是像中西医结合
般综合运用机械方法和知识方法。对于成熟的中文分词系统,需要多种算法综合处理问题。
"""# Build Inverted-Index for documentsinverted = {}documents = {'doc1':doc1, 'doc2':doc2, 'doc3':doc3, 'doc4':doc4, 'doc5':doc5}for doc_id, text in documents.iteritems():doc_index = inverted_index(text)inverted_index_add(inverted, doc_id, doc_index)# Search one wordaWord = "分词"result_a_word = search_a_word(inverted, aWord)if result_a_word:result_a_word_docs = result_a_word.keys()print "'%s' is appeared at" %(aWord)for result_a_word_doc in result_a_word_docs:result_a_word_index = result_a_word[result_a_word_doc]for index in result_a_word_index:print (str(index) + ' '),print "of " + result_a_word_doc   print ""else:print "No matches!\r\n"#Search more than one wordwords = ["汉语", "切分"]result_words = search_words(inverted, words)if result_words:print ("["),for i in range(len(words)):print ("%s " %(words[i])),print ("] are appeared at the "),for result_words_doc in result_words:print (result_words_doc + ' '),print "\r\n"else:print "No matches!\r\n"#Search phrasephrase = "中文分词"result_phrase = search_phrase(inverted, phrase)if result_phrase:result_phrase_docs = result_phrase.keys()print "'%s' is appeared at the " %(phrase)for result_phrase_doc in result_phrase_docs:result_phrase_index = result_phrase[result_phrase_doc]for index in result_phrase_index:print (str(index) + ' '),print "of " + result_phrase_docprint ""else:print "No matches!\r\n"

Python利用结巴分词进行中文分词相关推荐

  1. Py之jieba:Python包之jieba包(中文分词最好的组件)简介、安装、使用方法之详细攻略

    Py之jieba:Python包之jieba包(中文分词最好的组件)简介.安装.使用方法之详细攻略 目录 jieba简介 jieba安装 jieba使用方法 1.进行分词 jieba简介 jieba应 ...

  2. 基于python中jieba包的中文分词中详细使用(一)

    文章目录 基于python中jieba包的中文分词中详细使用(一) 01.前言 02.jieba的介绍 02.1 What 02.2特点 02.3安装与使用 02.4涉及到的算法 03.主要功能 03 ...

  3. 基于python中jieba包的中文分词中详细使用(二)

    文章目录 基于python中jieba包的中文分词中详细使用(二) 01.前言 02.关键词提取 02.01基于TF-IDF算法的关键词提取 02.02词性标注 02.03并行分词 02.04Toke ...

  4. 基于python中jieba包的中文分词中详细使用

    基于python中jieba包的中文分词中详细使用(一) 01.前言 之前的文章中也是用过一些jieba分词但是基本上都是处于皮毛,现在就现有的python环境中对其官方文档做一些自己的理解以及具体的 ...

  5. python的jieba库第一次中文分词记录

    python的jieba库第一次中文分词记录 记录一下最基本的jieba分词程序 1.通过cut import jiebaseg = jieba.cut("这是一段中文字符", c ...

  6. 中文分词_中文分词及其应用

    一.中文分词原理 中文分词是指将一个汉字序列切分成一个一个单独的词.分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.现有的分词方法可分为三大类,分别是基于字符串匹配的分词方法.基于理解的分 ...

  7. Data Mining Machine Learning学习笔记 机器学习入门笔记 之jieba分词(中文分词)(二)

    第二章 Rationlism & Empiricism 理性主义和经验主义 Rationalism (按照人类的方式进行处理,做词法,语法,语义分析) Natural Language Pro ...

  8. mysql 二元分词_MySQL 中文分词原理

    一,首先我们来了解一下其他几个知识点: 1. Mysql的索引意义? 索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里.当然,索引可以加快检索速度,但是它也同时降低了索引列的插入,删除和 ...

  9. 什么是中文分词及中文分词的应用

    什么是中文分词?     何为分词?中文分词与其他的分词又有什么不同呢?分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只 ...

  10. 什么是中文分词以及中文分词的应用简介

    什么是中文分词?     何为分词?中文分词与其他的分词又有什么不同呢?分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只 ...

最新文章

  1. LeetCode简单题之数组形式的整数加法
  2. 混合云环境中扩展Kubernetes的挑战及方案
  3. YUV 后面数字的含义_高速公路标示牌上的字母和数字,到底什么意思?很多人都不知道...
  4. BootStrap中对input的type自带的验证种类
  5. CROSS APPLY 和outer apply
  6. VTK:Utilities之Screenshot
  7. 微软翻译api的使用介绍和注意事项
  8. 【button】 按钮组件说明
  9. c语言单向循环链表实现增删,C语言单向非循环链表增删查改实现
  10. Linux 命令(27)—— echo 命令
  11. Qt下的模态和非模态对话框
  12. Struts 常用标签的使用
  13. 界面设计配色方案说明图一(含RGB配色表)
  14. ps 去除gif水印
  15. 秒拍3月短视频榜单发布,MCN化是2017年的大势所趋?
  16. 2021年中国化妆品发展现状及进出口状况分析:消费升级局面下,化妆品市场依旧景气 [图]
  17. python之父:《Python程序员指南》这本书你应该了解以下,pdf
  18. Cell | 共生菌群通过γδ T细胞促进肺癌的发展
  19. 一个合格的项目经理都需要做哪些事情?
  20. vim 安装YouCompleteMe 自动补全插件

热门文章

  1. 如何运用Origin进行曲线拟合
  2. 抗滑桩初始弹性系数计算_抗滑桩设计验算1
  3. 软件项目开发与管理(单代号网络图参考例题)
  4. shell脚本教程--Bash shell--4.流控、循环
  5. 谐波平衡 matlab,解非线性振动问题的摄动谐波平衡法
  6. 摄动法在计算机中的应用,H理论在计算机控制系统摄动模型中的应用研究
  7. word排版一般步骤
  8. Android 高通配置SUPL
  9. DEDECMS自动采集更新伪原创完美版插件
  10. 解决依赖包引入后重复问题Duplicate zip entry