`
san_yun
  • 浏览: 2663656 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

MMSEG的python实现

    博客分类:
  • nltk
 
阅读更多

原文:http://yongsun.me/2013/06/simple-implementation-of-mmseg-with-python/

 

Since I heard of MMSEG Chinese word segmentation algorithm (http://technology.chtsai.org/mmseg/) many years ago, I finally implemented it with Python as a programing practice in my team, dictionary file and character frequencies from mmseg4j project.

 

#!/usr/bin/python 
# -*- encoding: UTF-8 -*-

import codecs
import sys
from math import log
from collections import defaultdict

class Trie (object):
    class TrieNode:
        def __init__ (self):
            self.val = 0
            self.trans = {}

    def __init__ (self):
        self.root = Trie.TrieNode()

    def __walk (self, trienode, ch):
        if ch in trienode.trans:
            trienode = trienode.trans[ch]
            return trienode, trienode.val
        else:
            return None, 0

    def add (self, word, value=1):
        curr_node = self.root
        for ch in word:
            try: 
                curr_node = curr_node.trans[ch]
            except:
                curr_node.trans[ch] = Trie.TrieNode()
                curr_node = curr_node.trans[ch]

        curr_node.val = value

    def match_all (self, word):
        ret = []
        curr_node = self.root
    
        for ch in word:
            curr_node, val = self.__walk (curr_node, ch)
            if not curr_node: 
                break
    
            if val:
                ret.append (val)

        return ret

class Dict (Trie):
    def __init__(self, fname):
        super (Dict, self).__init__()
        self.load(fname)

    def load(self, fname):
        file = codecs.open(fname, 'r', 'utf-8')
        for line in file:
            word = line.strip()
            self.add(word, word)
        file.close()

class CharFreqs (defaultdict):
    def __init__ (self, fname):
        super (CharFreqs, self).__init__(lambda:1)
        self.load(fname)

    def load (self, fname):
        file = codecs.open(fname, 'r', 'utf-8')
        for line in file:
            ch, freq = line.strip().split()
            self[ch] = freq
        file.close()
        
class MMSeg:
    class Chunk:
        def __init__ (self, words, chrs):
            self.words  = words
            self.lens   = map(lambda x:len(x), words)
            self.length = sum(self.lens)
            self.mean   = float(self.length) / len(words)
            self.var    = sum(map(lambda x: (x-self.mean)**2, self.lens)) / len(self.words)
            self.degree = sum([log(float(chrs[x])) for x in words if len(x)==1])

        def __str__ (self):
            return ' '.join(self.words).encode('UTF-8') + \
                   "(%f %f %f %f)" % (self.length, self.mean, self.var, self.degree)

        def __lt__ (self, other):
            return (self.length,  self.mean,  -self.var,  self.degree) <  \
                   (other.length, other.mean, -other.var, other.degree)

    def __init__(self, dic, chrs):
        self.dic  = dic
        self.chrs = chrs

    def __get_chunks (self, s, depth=3):
        ret = []
        def __get_chunks_it (s, num, segs):
            if (num == 0 or not s) and segs:
                ret.append(MMSeg.Chunk(segs, self.chrs))
            else:
                m = self.dic.match_all(s)
                if not m:
                    __get_chunks_it (s[1:], num-1, segs+[s[0]])
                for w in m:
                    __get_chunks_it (s[len(w):], num-1, segs+[w])
     
        __get_chunks_it (s, depth, [])
        return ret

    def segment (self, s):
        while s:
            chunks = self.__get_chunks(s)
            best = max(chunks)
            yield best.words[0]
            s = s[len(best.words[0]):]

if __name__ == "__main__":
    dic = Dict("dict.utf8")
    chrs = CharFreqs("chars.utf8")
    mmseg = MMSeg(dic, chrs)

    enc = sys.getfilesystemencoding()
    while True:
        try:
            s = raw_input ("Test String: ")
        except:
            break

        print "Test Result: ",
        for w in mmseg.segment(s.decode(enc)):
            print w.encode(enc),
        print '\n'

# -*- indent-tabs-mode: nil -*- vim:et:ts=4

 

分享到:
评论

相关推荐

    Python中文分词实现方法(安装pymmseg)

    本文实例讲述了Python中文分词实现方法。分享给大家供大家参考,具体如下: 在Python这pymmseg-cpp 还是十分方便的! 环境 ubuntu10.04 , python2.65 步骤: 1 下载mmseg-cpp的源代码 ...

    在tomcat环境下搭建solr和mmseg4j搜索引擎

    本教程将详细阐述如何在Tomcat服务器环境下搭建Solr搜索引擎,并结合mmseg4j分词器进行文本处理,以便实现更精确的中文搜索。以下是你需要了解的关键知识点: 1. **Tomcat服务器**:Tomcat是一个开源的、轻量级的...

    基于自训练范式的雾天场景鲁棒语义分割算法python实现源码+项目说明.zip

    基于自训练范式的雾天场景鲁棒语义分割算法python实现源码+项目说明.zip 雾天场景语义分割(SFSS)是一个特别具有挑战性的问题,因为雾造成的图像模糊增加了识别难度,且相关数据标注成本高昂。尽管使用领域自适应技术...

    Friso中文分词器 v1.6.4

    为您提供Friso中文分词器下载,Friso 是使用 c 语言开发的一款开源的高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入其他程序中, 例如:MySQL,PHP,并且提供了php5,php7...

    中文分词词组库及工具汇总(全).rar

    - 这些分词工具多是基于Python实现的,Python因其丰富的自然语言处理库和简洁的语法,成为NLP领域的首选编程语言。用户可以利用这些工具和词库,结合Python的便利性,轻松实现中文文本的分词处理。 总结来说,这个...

    小型GIS项目SunMap

    考虑到这是一个从底层实现的项目,可能涉及的编程技术包括C++、Python或Java等,这些语言通常用于GIS开发。同时,还需要掌握GIS库的使用,如GDAL/OGR(用于处理栅格和矢量数据)和GEOS(用于几何操作)。 8. **...

    主流分词工具的词库.zip

    与jieba类似,IK的词典同样不包含词性信息,需要结合其他工具或自定义实现来添加词性标注功能。 mmseg是基于最长匹配算法的中文分词工具,它通过查找最长的可匹配词来确定分词结果。mmseg的优点在于处理歧义的能力...

    centos 6.5安装coreseek,亲测ok

    你可以选择适合你的编程语言,将CoreSeek集成到你的项目中,实现全文检索功能。 总结,安装和配置CoreSeek在CentOS 6.5上虽然涉及到多个步骤,但只要按照上述步骤操作,就能成功搭建一个高效、稳定的全文检索环境。...

    Friso中文分词器-其他

    Friso 是使用 c 语言开发的一款开源的高性能中文分词器,使用流行的mmseg算法实现。完全基于模块化设计和实现,可以很方便的植入其他程序中, 例如:MySQL,PHP,并且提供了php5,php7,ocaml,lua的插件实现。源码...

    mmsegmentation

    这个项目为研究人员和开发者提供了一个强大的框架,用于实现和训练各种分割模型。 该项目的核心可能基于PyTorch框架,因为它是深度学习领域常用的库,尤其在研究和实验中非常流行。CITATION.cff 文件通常包含项目...

    HuhuSeg:简单中文分割器,关键字提取器和其他示例

    同时HuhuSeg实现了一个简单但是非常高效的词图生成方式,由HanLP[3]的启发而来。同时核心词典直接使用了jieba[2]的词频词典。HuhuSeg implemented a simple but graceful words-gram generation enlightened by ...

    coreseek-4.1-win32

    CoreSeek的核心功能就是构建和管理这样的索引,以实现高效检索。 **3. 安装CoreSeek 4.1-Win32** 在解压“coreseek-4.1-win32.zip”后,你需要按照以下步骤进行安装: - 配置环境:确保系统已安装VC++运行库和必要...

    coreseek-4.1-win32.zip

    6. **分布式搜索**:CoreSeek支持分布式部署,可以通过集群实现负载均衡和高可用性,满足大规模数据的检索需求。 7. **API接口**:CoreSeek提供了丰富的API接口,包括PHP、Python、Java等,方便开发者将搜索功能...

    ContextPrior:“场景分割的上下文优先”的实现

    实现。 消息 核心代码的简单版本已发布。 它基于mmsegmentation。 您可以将代码集成到mmseg中以运行实验。 最近,我忙于求职和博士学位论文。 经过这段时间之后,我将发布完整版本。 我们在ADE20K val集上达到46.3...

    coreseek-3.2.14.tar.gz

    5. **API接口**:CoreSeek提供了多种API接口,如PHP、Python、Java等,使得开发者可以方便地将其集成到自己的应用程序中,实现数据的检索和展示。 6. **实时更新**:CoreSeek支持实时或准实时的索引更新,这意味着...

    coreseek-3.2.13.tar.gz

    2. **中文分词支持**:Coreseek特别针对中文环境进行了优化,内置了MMSEG分词算法,能有效地对中文文本进行分词处理,提高搜索的准确性和召回率。 3. **多数据源支持**:Coreseek能够连接多种数据库系统,如MySQL、...

    官网不能下,这里可以下载coreseek-3.2.14-.tar.gz

    1. **中文分词**:Coreseek采用了开源的MMSEG(MaxMatch Multiple Segmentation)算法,能够对中文文本进行精确的分词,提高搜索的准确性。 2. **全文检索**:它提供了快速的全文索引和查询功能,可以处理大量数据...

    coreseek站内搜索

    - **中文分词**:CoreSeek针对中文进行了优化,内置了成熟的中文分词引擎,如MMSEG(多模式中文分词算法),能够准确地进行词语划分,提高搜索的精确性。 - **全文索引**:通过建立高效的倒排索引,CoreSeek能够在...

Global site tag (gtag.js) - Google Analytics