精华内容
下载资源
问答
  • 分词是自然语言处理的一个...前向最大匹配算法后向最大匹配算法双向最大匹配算法三种方法思想都很简单,今天我们用python实现前向最大匹配算法。前向最大匹配算法,顾名思义,就是从待分词句子的左边向右边搜索,...

    分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格,可以将中文分词方法简单归纳为:基于词表的分词方法

    基于统计的分词方法

    基于序列标记的分词方法

    其中,基于词表的分词方法最为简单,根据起始匹配位置不同可以分为:前向最大匹配算法

    后向最大匹配算法

    双向最大匹配算法

    三种方法思想都很简单,今天我们用python实现前向最大匹配算法。

    前向最大匹配算法,顾名思义,就是从待分词句子的左边向右边搜索,寻找词的最大匹配。我们需要规定一个词的最大长度,每次扫描的时候寻找当前开始的这个长度的词来和字典中的词匹配,如果没有找到,就缩短长度继续寻找,直到找到字典中的词或者成为单字。

    下面是我的代码。word_dict = [             ]

    test_str = (text):

    text:

    (text) == :

    text

    text word_dict:

    text

    :

    small = (text) -         text = text[:small]

    getSeg(text)

    ():

    test_strword_dict

    test_str = test_str.strip()

    max_len = ((word) word word_dict)

    result_str = []      result_len =     (test_str)

    test_str:

    tmp_str = test_str[:max_len]

    seg_str = getSeg(tmp_str)

    seg_len = (seg_str)

    result_len = result_len + seg_len

    seg_str.strip():

    result_str.append(seg_str)

    test_str = test_str[seg_len:]

    (result_str)

    __name__ == :

    main()

    看一下分词的结果吧!

    3541465c8eedb428bc27f5f7b46d9c3f.png

    本文来自:机器在学习

    展开全文
  • /usr/bin/python#encoding=gbkimport sysdictMaxLength = 5dctDict = {}encoding='gbk''''初始化字典、初始化最大词长'''def initDct(dct):global dctDictglobal dictMaxLengthdctobj = open(dct)for line in dctobj...

    #!/usr/bin/python

    #encoding=gbk

    import sys

    dictMaxLength = 5

    dctDict = {}

    encoding='gbk'

    '''

    初始化字典、初始化最大词长

    '''

    def initDct(dct):

    global dctDict

    global dictMaxLength

    dctobj = open(dct)

    for line in dctobj:

    line = line.strip()

    word = line.split("\t")[0].strip()

    dctDict[word] = line

    word = word.strip().decode(encoding)

    if dictMaxLength < len(word):

    dictMaxLength = len(word)

    dctobj.close()

    '''

    正向最大匹配算法

    '''

    def maximunMathching(sent):

    global dictMaxLength

    global dctDict

    index = 0

    j = 0

    result = ""

    sent = sent.strip().decode(encoding)

    sentLen = len(sent)

    while(index < sentLen):

    for i in range(dictMaxLength, 0, -1):

    j = i + index

    if j > sentLen:

    j = sentLen

    sub = sent[index:j]

    if len(sub) > 1:

    if dctDict.has_key(sub.encode(encoding)):

    index += i

    result += sub.encode(encoding) + " "

    break;

    else:

    index += i

    if not sub.encode(encoding) == " ":

    result += sub.encode(encoding) + " "

    break

    return result.strip()

    '''

    逆向最大匹配算法

    '''

    def reverseMaximunMathching(sent):

    global dctDict

    global dictMaxLength

    sb = ""

    sent = sent.strip().decode(encoding)

    index = len(sent)

    j = 0

    list = []

    while index >= 0:

    for i in range(dictMaxLength, 0, -1):

    j = index - i

    if j < 0: j = 0

    sub = sent[j:index]

    if len(sub) > 1:

    if dctDict.has_key(sub.encode(encoding)):

    list.append(sub.encode(encoding))

    index = index - i

    break;

    else:

    if not sub.encode(encoding) == " ":

    list.append(sub.encode(encoding))

    index = index - i

    break

    list.reverse()

    return " ".join(list)

    '''

    非字典词、单字字典词、总词数 越少越好

    '''

    def segmenter(sent):

    mm = maximunMathching(sent).strip()

    rmm = reverseMaximunMathching(sent).strip()

    if mm == rmm:

    return mm

    else:

    return bmmResult(mm, rmm)

    '''

    非字典词、单字字典词、总词数 越少越好

    '''

    def bmmResult(mm, rmm):

    #print mm

    #print rmm

    global dctDict

    mmlist = mm.split(" ")

    rmmlist = rmm.split(" ")

    oovNum_mm = 0

    oovNum_rmm = 0

    sigNum_mm = 0

    sigNum_rmm = 0

    totNum_mm = len(mmlist)

    totNum_rmm = len(rmmlist)

    for word in mmlist:

    if not dctDict.has_key(word):

    oovNum_mm += 1

    if len(word.decode(encoding)) == 1:

    sigNum_mm += 1

    for word in rmmlist:

    if not dctDict.has_key(word):

    oovNum_rmm += 1

    if len(word.decode(encoding)) == 1:

    sigNum_rmm += 1

    MMWMix = 0

    RMMNWMix = 0

    if oovNum_mm > oovNum_rmm:

    RMMNWMix += 1

    elif oovNum_mm < oovNum_rmm:

    MMWMix += 1

    if sigNum_mm > sigNum_rmm:

    RMMNWMix += 1

    elif sigNum_mm < sigNum_rmm:

    MMWMix += 1

    if totNum_mm > totNum_rmm:

    RMMNWMix += 1

    elif totNum_mm < totNum_rmm:

    MMWMix += 1

    #print oovNum_mm, sigNum_mm, totNum_mm

    #print oovNum_rmm, sigNum_rmm, totNum_rmm

    if MMWMix < MMWMix:

    return mm

    else:

    return rmm

    def handleFile(input, output):

    inputobj = open(input)

    outputobj = open(output,"w")

    index = 0

    for line in inputobj:

    index += 1

    if index % 100000 == 0:

    print str(index) + "\r"

    line = line.strip().lower()

    seg = segmenter(line)

    outputobj.write(seg.strip() + "\n")

    inputobj.close()

    outputobj.close()

    if __name__ == '__main__':

    if len(sys.argv) != 4:

    print "Usage %s dict[in] inFile[in] outFile[out]." %sys.argv[0]

    sys.exit(-1)

    dct = sys.argv[1]

    input = sys.argv[2]

    output = sys.argv[3]

    initDct(dct)

    #sent = "chien中华人民共和国在1949年成立了"

    #print segmenter(sent)

    handleFile(input, output)

    展开全文
  • {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台;社区覆盖了云计算、大数据、人工智能、...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台;社区覆盖了云计算、大数据、人工智能、IoT、云原生、数据库、微服务、安全、开发与运维9大技术领域。","link1":"https://developer.aliyun.com/group/?spm=a2c6h.12883283.1377930.25.7287201c9RKTCi&groupType=other","link":"https://developer.aliyun.com/","icon":"https://img.alicdn.com/tfs/TB1TlXBEkT2gK0jSZPcXXcKkpXa-200-200.png","btn2":"开发者藏经阁","tip":"打通开发者成长路径,学习中心 。全线阿里云技术大牛公开课,立即查看","btn1":"技术与产品技术圈","link2":"https://developer.aliyun.com/topic/ebook?spm=a2c6h.12883283.1362932.15.7287201c9RKTCi","title":"阿里云开发者社区"}],"search":[{"txt":"学习中心","link":"https://developer.aliyun.com/learning?spm=a2c6h.13788135.1364563.41.299f5f24exe3IS"},{"txt":"技能测试中心 ","link":"https://developer.aliyun.com/exam?spm=a2c6h.13716002.1364563.42.6cac18a3JWCM5U"},{"txt":"开发者云 ","link":"https://developer.aliyun.com/adc/?spm=a2c6h.13716002.1364563.59.6b0818a3DV0vzN"},{"txt":"在线编程 ","link":"https://developer.aliyun.com/coding?spm=5176.13257455.1364563.57.701e7facHvqi5r"},{"txt":"学习中心 ","link":"https://developer.aliyun.com/learning?spm=a2c6h.12883283.1364563.41.5f1f201c5CLDCC"},{"txt":"高校计划 ","link":"https://developer.aliyun.com/adc/college/?spm=a2c6h.13716002.1364563.58.6cac18a3JWCM5U"}],"countinfo":{"search":{"length_pc":0,"length":0},"card":{"length_pc":0,"length":0}}}

    {"$env":{"JSON":{}},"$page":{"env":"production"},"$context":{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台;社区覆盖了云计算、大数据、人工智能、IoT、云原生、数据库、微服务、安全、开发与运维9大技术领域。","link1":"https://developer.aliyun.com/group/?spm=a2c6h.12883283.1377930.25.7287201c9RKTCi&groupType=other","link":"https://developer.aliyun.com/","icon":"https://img.alicdn.com/tfs/TB1TlXBEkT2gK0jSZPcXXcKkpXa-200-200.png","btn2":"开发者藏经阁","tip":"打通开发者成长路径,学习中心 。全线阿里云技术大牛公开课,立即查看","btn1":"技术与产品技术圈","link2":"https://developer.aliyun.com/topic/ebook?spm=a2c6h.12883283.1362932.15.7287201c9RKTCi","title":"阿里云开发者社区"}],"search":[{"txt":"学习中心","link":"https://developer.aliyun.com/learning?spm=a2c6h.13788135.1364563.41.299f5f24exe3IS"},{"txt":"技能测试中心 ","link":"https://developer.aliyun.com/exam?spm=a2c6h.13716002.1364563.42.6cac18a3JWCM5U"},{"txt":"开发者云 ","link":"https://developer.aliyun.com/adc/?spm=a2c6h.13716002.1364563.59.6b0818a3DV0vzN"},{"txt":"在线编程 ","link":"https://developer.aliyun.com/coding?spm=5176.13257455.1364563.57.701e7facHvqi5r"},{"txt":"学习中心 ","link":"https://developer.aliyun.com/learning?spm=a2c6h.12883283.1364563.41.5f1f201c5CLDCC"},{"txt":"高校计划 ","link":"https://developer.aliyun.com/adc/college/?spm=a2c6h.13716002.1364563.58.6cac18a3JWCM5U"}],"countinfo":{"search":{"length_pc":0,"length":0},"card":{"length_pc":0,"length":0}}}}

    展开全文
  • 前向最大匹配def fmmseg(sen,max,strs):'''sen: 待切分句子max: 最大切分长度strs: 词典列表'''maxs=maxreturnlist=[]while len(sen)>0:while max>0:if(max==1):returnlist.append(sen[:1])sen=sen[1:]max=...

    前向最大匹配

    def fmmseg(sen,max,strs):

    '''

    sen: 待切分句子

    max: 最大切分长度

    strs: 词典列表

    '''

    maxs=max

    returnlist=[]

    while len(sen)>0:

    while max>0:

    if(max==1):

    returnlist.append(sen[:1])

    sen=sen[1:]

    max=maxs

    break

    else:

    word=sen[:max]

    if(word in strs):

    returnlist.append(word)

    sen=sen[max:]

    max=maxs

    break

    else:

    max-=1

    return returnlist

    逆向最大匹配

    def bmmseg(sen,max,strs):

    '''

    sen: 待切分句子

    max: 最大切分长度

    strs: 词典列表

    '''

    maxs=max

    returnlist=[]

    while len(sen)>0:

    while max>0:

    if(max==1):

    returnlist.append(sen[-1:])

    sen=sen[:-1]

    max=maxs

    break

    else:

    word=sen[-max:]

    if(word in strs):

    returnlist.append(word)

    sen=sen[:-max]

    max=maxs

    break

    else:

    max-=1

    return returnlist

    完整代码

    import time

    def bmmseg(sen,max,strs):

    '''

    sen: 待切分句子

    max: 最大切分长度

    strs: 词典列表

    '''

    maxs=max

    returnlist=[]

    while len(sen)>0:

    while max>0:

    if(max==1):

    returnlist.append(sen[-1:])

    sen=sen[:-1]

    max=maxs

    break

    else:

    word=sen[-max:]

    if(word in strs):

    returnlist.append(word)

    sen=sen[:-max]

    max=maxs

    break

    else:

    max-=1

    return returnlist

    def fmmseg(sen,max,strs):

    '''

    sen: 待切分句子

    max: 最大切分长度

    strs: 词典列表

    '''

    maxs=max

    returnlist=[]

    while len(sen)>0:

    while max>0:

    if(max==1):

    returnlist.append(sen[:1])

    sen=sen[1:]

    max=maxs

    break

    else:

    word=sen[:max]

    if(word in strs):

    returnlist.append(word)

    sen=sen[max:]

    max=maxs

    break

    else:

    max-=1

    return returnlist

    if __name__=="__main__":

    start=time.time()

    print("=============go=============")

    str=open("dict.txt",'r',encoding='utf-8').readlines()

    strs=[i.strip() for i in str]

    sen="你昨天晚上吃饭团了吗"

    r=fmmseg(sen,4,strs)

    print(r)

    r=bmmseg(sen,4,strs)

    print(r[::-1])

    end=time.time()

    print(end-start)

    测试字典 dict.txt

    吃饭

    昨天

    晚上

    饭团

    切分结果

    =============go=============

    ['你', '昨天', '晚上', '吃饭', '团', '了', '吗']

    ['你', '昨天', '晚上', '吃', '饭团', '了', '吗']

    0.0

    [Finished in 0.2s]

    展开全文
  • 使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法。算法描述正向最大匹配算法先设定扫描的窗口大小maxLen(最好是字典最长的单词长度),从左向右取待切分汉语句的maxLen...
  • 下面我们看看基于词典的逆向最大匹配算法的实现,实验表明,对于汉语来说,逆向最大匹配算法比(正向)最大匹配算法更有效,如下代码所示:publicstaticListsegReverse(Stringtext){Stackresul...
  • 龙源期刊网http://www.qikan.com.cn警务应用中基于双向最大匹配法的中文分词算法实现作者:陶伟来源:《电子技术与软件工程》2016年第04期摘要中文分词是信息提取、信息检索、机器翻译、文本分类、自动文摘、自然...
  • 算法流程:假设词典中最长的单词为 5 个(MAX_LENGTH),那么最大匹配的起始子串字数也为 5 个(1)扫描字典,测试读入的子串是否在字典中(2)如果存在,则从输入中删除掉该子串,重新按照规则取子串,重复(1)(3)如果不...
  • 对于以下示例,下面的所有边可以是最大匹配:{1:2,2:1}或{1:3,3:1}或{1:4,4:1}import networkx as nximport matplotlib.pyplot as pltG = nx.MultiDiGraph()edges = [(1,3), (1,4), (1,2)]nx.is_bipartite(G...
  • 本文主要对词干提取及词形还原以及最大匹配算法进行了介绍和代码示例,Python实现,下面我们一起看看具体内容。自然语言处理中一个很重要的操作就是所谓的stemming和lemmatization,二者非常类似。它们是词形规范化...
  • 请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图G,在G的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分...
  • python 双向最大匹配算法 双向最大匹配算法 双向最大匹配算法
  • 往期回顾道路交通信息常用检测技术介绍——第三篇:射频检测器道路交通信息常用检测技术介绍——第二篇:环形线圈检测器道路交通信息常用检测技术介绍——第一篇:地磁检测...今天讲一种常用的自然语言处理算法——...
  • 使用python实现正向、逆向和双向最大匹配算法 正向最大匹配 class leftMax(object): def __init__(self,dict_path): self.dictionary = set() #定义字典 self.maximum = 0 #最大匹配长度 with open(dict_path,...
  • 本篇介绍基于词典匹配的中文分词算法。1. 使用效果1.1 输入输入待分词的句子或文章,如:黑夜给了我黑色的眼睛,我却用它寻找光明。1.2 输出返回分词结果:黑夜/给/了/我/黑色/的/眼睛/,/我/却/用/它/寻找/光明/。2...
  • 最大匹配算法分为正向最大匹配算法和逆向最大匹配算法和双向最大匹配算法。 正向最大匹配算法 正向最大匹配算法,就是从左往右去扫描,然后寻找词的最大匹配。 首先需要规定一个词可能的最大长度,每次扫描的时候...
  • 具体包括正向最大匹配法、逆向最大匹配法和双向最大匹配法 正向最大匹配 算法描述 ①从左向右取待切分汉语句的m 个字符作为匹配字段, m 为机器词典中最长词条的 字符数。 ②查找机器词典并进行匹配。 若匹配成功, ...
  • 双向最大匹配算法3.1 双向最大匹配算法的原理 1. 前向最大匹配算法 1.1 前向最大匹配算法的原理 首先,我们分词的目的是将一段中文分成若干个词语,前向最大匹配就是从前向后寻找在词典中存在的词。 废话不多说,...
  • 中文分词算法—最大匹配法1 正向最大匹配法FMM2 反向最大匹配法BMM3 双向最大匹配法4 python实现代码5 参考文献 1 正向最大匹配法FMM 2 反向最大匹配法BMM 3 双向最大匹配法 4 python实现代码 5 参考文献 user_dict ...
  • 本人初学nlp,使用的是机械工业出版社的《python自然语言处理实战核心技术与算法》,学习到了双向最大匹配法,于是写下这篇文章记录一下整个代码的工作原理以及相应的理解。 目录一、匹配切分二、算法代码及详谈1. ...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法。算法描述正向最大匹配算法先设定扫描的窗口大小maxLen(最好是字典最长的单词长度),从左向右取待切分汉语句的maxLen...
  • 理论介绍 分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到...3.双向最大匹配算法 三种方法思想都很简单,今
  • #正向向最大匹配法 def MM(text): #读取词典 dictionary = [] dic_path = r'F:\大三下\自然语言处理\chapter-4\dic.utf8' # 在windows上使用open打开utf-8编码的txt文件时开头会有一个多余的字符 # 它叫BOM,是...
  • /usr/bin/python #encoding=gbk import sys dictMaxLength = 5 dctDict = {} encoding='gbk' ''' 初始化字典、初始化最大词长 ''' def initDct(dct): global dctDict global dictMaxLength dctobj ...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

python双向最大匹配算法

python 订阅