精华内容
下载资源
问答
  • python实现双向最大匹配

    千次阅读 2019-01-08 21:01:29
    -- coding: utf-8 -- “”" Created on Sat Jan 5 15:53:18 2019 @author: 86199 “”" class MM(): def init(self): self.window_size = 3 def cut(self,text): ...dic = ...

    在这里插入图片描述在这里插入图片描述

    -- coding: utf-8 --

    “”"
    Created on Sat Jan 5 15:53:18 2019

    @author: 86199
    “”"

    class MM():
    def init(self):
    self.window_size = 3
    def cut(self,text):
    result = []
    index = 0
    text_length = len(text)
    dic = [‘研究’,‘研究生’,‘生命’,‘命’,‘的’,‘起源’]
    while text_length > index:
    for size in range(self.window_size+index,index,-1):
    piece = text[index:size]
    if piece in dic:
    index = size - 1
    break
    index = index + 1
    result.append(piece+’----’)
    return(result)
    class RMM():
    def init(self):
    self.window_size = 3
    def cut(self,text):
    result = []
    index = 0
    index = len(text)
    dic = [‘研究’,‘研究生’,‘生命’,‘命’,‘的’,‘起源’]
    while index > 0:
    for size in range(index - self.window_size,index,):
    piece = text[size:index]
    if piece in dic:
    index = size + 1
    break
    index = index - 1
    result.append(piece+’----’)
    result.reverse()
    return(result)
    if name == ‘main’:
    text = ‘研究生命的起源’

    count1 = 0
    count2 = 0
    First = MM()
    Second = RMM()
    a = First.cut(text)
    b = Second.cut(text)
    if a == b:
        print(a)
    lena = len(a)
    lenb = len(b)
    if lena == lenb:
        for DY1 in a:
            if len(DY1) == 5:
                count1 = count1 + 1
        for DY2 in b:
            if len(DY2) == 5:
                count2 = count2 + 1
        if count1 > count2:
            print(b)
        else:
            print(a)
    if lena > lenb:
        print(b)
    if lena < lenb: 
        print(a) 
    
    展开全文
  • {"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(最好是字典最长的单词长度),从左向右取待切分汉语句的maxLen个字符作为匹配字段。查找词典并进行匹配。若匹配成功,则将这个匹配字段作为一个词切分出来,并将窗口向右移动这个单词的长度。若匹配不成功,则将这个匹配字段的最后一个字去掉,剩下的字符串作为新的匹配字段,进行再次匹配,重复以上过程,直到切分出所有词为止。

    反向最大匹配算法

    该算法是正向的逆向算法,区别是窗口是从后向左扫描,若匹配不成功,则去掉第一个字符,重复上述的匹配步骤。

    双向最大匹配算法

    双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法的到的结果进行比较,从而决定正确的分词方法。定义的匹配规则如下:

    如果正反向匹配算法得到的结果相同,我们则认为分词正确,返回任意一个结果即可。

    如果正反向匹配算法得到的结果不同,则考虑单字词、非字典词、总词数数量的数量,三者的数量越少,认为分词的效果越好。我们设定一个惩罚分数(score_fmm / score_bmm = 0),例如:正向匹配中单字词数量多于反向匹配,则正向匹配的分值score_fmm += 1。其他两个条件相同。可以根据实际的分词效果调整惩罚分数的大小,但由于没有正确分词的数据,因此惩罚分数都设为1。最后比较惩罚分数,返回较小的匹配结果。

    详例描述

    以“对外经济技术合作与交流不断扩大。”为例,详细描述算法如下:

    窗口大小设为4,句子长度为16,分词列表words = []。

    首先是正向匹配。sub_str = ‘对外经济’与词典进行匹配,匹配失败,窗口大小减一。

    sub_str = ‘对外经’与词典进行匹配,匹配失败,窗口大小减一。

    sub_str = ‘对外’与词典进行匹配,匹配成功,窗口大小恢复为4,向右移动之前匹配词的长度,此时sub_str = ‘经济技术’,将其添加至列表words中。重复上述步骤。

    当匹配到最后一个词时,算法停止。

    正向匹配结果如下:[‘对外’, ‘经济’, ‘技术’, ‘合作’, ‘与’, ‘交流’, ‘不断’, ‘扩大’, ‘。’]

    反向匹配如法炮制,结果如下:[‘对外’, ‘经济’, ‘技术’, ‘合作’, ‘与’, ‘交流’, ‘不断’, ‘扩大’, ‘。’]

    正向与反向匹配结果相同,返回任意一个。

    代码:

    加载字典

    def read_dict(path):

    words_dict = []

    with open(path, 'r') as r:

    line = r.readlines()

    # print(line)

    for i in line:

    word = i.split(',')

    words_dict.append(word[0])

    return words_dict

    window_size = 4

    正向匹配算法

    def fmm(source, words_dict):

    len_source = len(source) # 原句长度

    index = 0

    words = [] # 分词后句子每个词的列表

    while index < len_source: # 如果下标未超过句子长度

    match = False

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

    sub_str = source[index: index+i]

    if sub_str in words_dict:

    match = True

    words.append(sub_str)

    index += i

    break

    if not match:

    words.append(source[index])

    index += 1

    return words

    反向匹配算法

    def bmm(source, word_dict):

    len_source = len(source) # 原句长度

    index = len_source

    words = [] # 分词后句子每个词的列表

    while index > 0:

    match = False

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

    sub_str = source[index-i: index]

    if sub_str in words_dict:

    match = True

    words.append(sub_str)

    index -= i

    break

    if not match:

    words.append(source[index-1])

    index -= 1

    words.reverse() # 得到的列表倒序

    return words

    双向匹配算法

    def bi_mm(source, word_dict):

    forward = fmm(source, words_dict)

    backward = bmm(source, words_dict)

    # 正反向分词结果

    print("FMM: ", forward)

    print("BMM: ", backward)

    # 单字词个数

    f_single_word = 0

    b_single_word = 0

    # 总词数

    tot_fmm = len(forward)

    tot_bmm = len(backward)

    # 非字典词数

    oov_fmm = 0

    oov_bmm = 0

    # 罚分,罚分值越低越好

    score_fmm = 0

    score_bmm = 0

    # 如果正向和反向结果一样,返回任意一个

    if forward == backward:

    return backward

    # print(backward)

    else: # 分词结果不同,返回单字数、非字典词、总词数少的那一个

    for each in forward:

    if len(each) == 1:

    f_single_word += 1

    for each in backward:

    if len(each) == 1:

    b_single_word += 1

    for each in forward:

    if each not in words_dict:

    oov_fmm += 1

    for each in backward:

    if each not in backward:

    oov_bmm += 1

    # 可以根据实际情况调整惩罚分值

    # 这里都罚分都为1分

    # 非字典词越少越好

    if oov_fmm > oov_bmm:

    score_bmm += 1

    elif oov_fmm < oov_bmm:

    score_fmm += 1

    # 总词数越少越好

    if tot_fmm > tot_bmm:

    score_bmm += 1

    elif tot_fmm < tot_bmm:

    score_fmm += 1

    # 单字词越少越好

    if f_single_word > b_single_word:

    score_bmm += 1

    elif f_single_word < b_single_word:

    score_fmm += 1

    # 返回罚分少的那个

    if score_fmm < score_bmm:

    return forward

    else:

    return backward

    主函数,测试了分词的时间,包括加载词典的时间

    if __name__ == '__main__':

    start = time.time()

    words_dict = read_dict('chineseDic.txt')

    # print(bmm("我正在上自然语言处理课。", words_dict))

    # print("result: ", result)

    print("BiMM: ", bi_mm("对外经济技术合作与交流不断扩大。", words_dict))

    end = time.time()

    print("running time: " + str(end - start) + "s")

    展开全文
  • 正向最大匹配法分词目标:在词典中进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。算法流程:假设词典中最长的单词为 5 个(MAX_LENGTH),那么最大匹配的起始子串字数也为 5 个(1...
  • 下面是前向最大匹配、后项最大匹配和双向最大匹配的具体实现,使用的是python。 class WordSeg(object): def __init__(self, dic): self.dic = dic self.window_size = len(max(dic, key=len, default='')) ...
  • 龙源期刊网http://www.qikan.com.cn警务应用中基于双向最大匹配法的中文分词算法实现作者:陶伟来源:《电子技术与软件工程》2016年第04期摘要中文分词是信息提取、信息检索、机器翻译、文本分类、自动文摘、自然...
  • 正向最大匹配法分词目标:在词典中进行扫描,尽可能地选择与词典中最长单词匹配的词作为目标分词,然后进行下一次匹配。算法流程:假设词典中最长的单词为 5 个(MAX_LENGTH),那么最大匹配的起始子串字数也为 5 个(1...
  • 分词是自然语言处理的一个...前向最大匹配算法后向最大匹配算法双向最大匹配算法三种方法思想都很简单,今天我们用python实现前向最大匹配算法。前向最大匹配算法,顾名思义,就是从待分词句子的左边向右边搜索,...
  • 中文分词算法—最大匹配法1 正向最大匹配法FMM2 反向最大匹配法BMM3 双向最大匹配法4 python实现代码5 参考文献 1 正向最大匹配法FMM 2 反向最大匹配法BMM 3 双向最大匹配法 4 python实现代码 5 参考文献 user_dict ...
  • 在之前的博文中介绍了基于词典的正向最大匹配算法,用了不到50行代码就实现了,然后分析了词典查找算法的时空复杂性,最后使用前缀树来实现词典查找算法,并做了3次优化。下面我们看看基于词典的逆向最大匹配算法的...
  • 本文主要对词干提取及词形还原以及最大匹配算法进行了介绍和代码示例,Python实现,下面我们一起看看具体内容。自然语言处理中一个很重要的操作就是所谓的stemming和lemmatization,二者非常类似。它们是词形规范化...
  • 使用python实现正向、逆向和双向最大匹配算法 正向最大匹配 class leftMax(object): def __init__(self,dict_path): self.dictionary = set() #定义字典 self.maximum = 0 #最大匹配长度 with open(dict_path,...
  • 双向最大匹配算法3.1 双向最大匹配算法的原理 1. 前向最大匹配算法 1.1 前向最大匹配算法的原理 首先,我们分词的目的是将一段中文分成若干个词语,前向最大匹配就是从前向后寻找在词典中存在的词。 废话不多说,...
  • 具体包括正向最大匹配法、逆向最大匹配法和双向最大匹配法 正向最大匹配 算法描述 ①从左向右取待切分汉语句的m 个字符作为匹配字段, m 为机器词典中最长词条的 字符数。 ②查找机器词典并进行匹配。 若匹配成功, ...
  • 理论介绍 分词是自然语言处理的一个基本工作,中文分词和英文不同,字词之间没有空格。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到...3.双向最大匹配算法 三种方法思想都很简单,今
  • 本次实验内容是基于词典的双向匹配算法的中文分词算法的实现。使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法。 算法描述 正向最大匹配算法 先设定扫描的窗口大小...
  • 本次实验内容是基于词典的双向匹配算法的中文分词算法的实现。使用正向和反向最大匹配算法对给定句子进行分词,对得到的结果进行比较,从而决定正确的分词方法。算法描述正向最大匹配算法先设定扫描的窗口大小maxLen...
  • 前文传送门:从零开始学自然语言处理(一)—— jieba 分词从零开始学自然语言处理(二)—— jieba 黑科技从零开始学自然语言处理(三)——手把手带你用代码实现word2vec从零开始学自然语言处理(四)——手把手带你实现...
  • #正向向最大匹配法 def MM(text): #读取词典 dictionary = [] dic_path = r'F:\大三下\自然语言处理\chapter-4\dic.utf8' # 在windows上使用open打开utf-8编码的txt文件时开头会有一个多余的字符 # 它叫BOM,是...
  • 参考书目:python自然语言处理实战——核心技术与算法 规则分词 顾名思义,直接靠规则来进行分词,这种方法是一种机械的分词...按照匹配的方式,规则分词主要有正向最大匹配法,逆向最大匹配法以及双向最大匹配...
  • Jupyter Notebook (IPython):一个能够让你最大限度地以交互式方式使用 Python 的丰富工具包。 awesome-jupyter 文件 文件管理和 MIME(多用途的网际邮件扩充协议)类型检测。 aiofiles:基于 asyncio,提供...
  • 分词 | 双向匹配中文分词算法python实现 ... 正向最大匹配算法实现之python实现 https://blog.csdn.net/Cuixinyang19_/article/details/82251553?utm_source=blogxgwz2 简单的逆向...
  • 特征提取初识

    2021-01-24 21:11:17
    文章目录特征提取初识基与传统算法的分词算法最大正相匹配最大逆向匹配最大双向最大匹配分词模型基于传统算法及统计学模型jieba模型注意补充jieba的分词算法jieba的使用简介词加权算法TF-IDF算法(term frequency–...
  • 尝试用Python实现一些简单的算法和数据结构 之前的算法和数据结构基本都是用Swift写的,现在尝试用Python实现一些简单的算法和数据结构。 update 20160704 准备加入《剑指offer》的习题python实现,以及机器学习过程...

空空如也

空空如也

1 2
收藏数 30
精华内容 12
关键字:

python实现双向最大匹配

python 订阅