Python实现——实现逆向最大匹配分词算法,即从右向左扫描,找到最长的词并切分。

题目内容:
实现逆向最大匹配分词算法,即从右向左扫描,找到最长的词并切分。如句子“研究生命的起源”,逆向最大匹配分词算法的输出结果为“研究 生命 的 起源”。

输入格式:
第一行是以utf-8格式输入的词表,每个词之间以空格分隔。
接下来是若干行以utf-8格式输入的中文句子。

输出格式:
以utf-8格式输出的逆向最大匹配的分词结果,每个词之间使用空格分隔。每个输入对应一行输出。

输入样例:
你 我 他 爱 北京 天安门 研究 研究生 命 生命 的 起源
研究生命的起源
我爱北京天安门

输出样例:
研究 生命 的 起源
我 爱 北京 天安门

注:以下是Python3.8的代码实现,如果要用Py2实现需要作相应修改。

#字典生成
def load_dic(s):
    words=s.split()
    word_dic=set()
    max_length=1
    for word in words:
        word_dic.add(word)
        if len(word)>max_length:
            max_length=len(word)
    return max_length, word_dic

#逆向最大匹配分词
def fmm_word_seg(sentence, word_dic, max_length):
    end=len(sentence)
    words=[]
    while end>0:
        for begin in range(max(end-max_length, 0),end):
            word=sentence[begin:end]
            if word in word_dic or end==begin+1:
                words.append(word)
                break
        end=begin
    return words

max_len, word_dic=load_dic(input())
for line in sys.stdin:
    words=fmm_word_seg(line, word_dic, max_len)
    for i in range(len(words)-1,0,-1):
        print (words[i],end=' ')
    print (words[0])

亦可参考博客:中文分词

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最大逆向匹配法是一种基于规则的分词方法,它以最大方式得到一个典中最作为匹配结果。本文将介绍如何使用Python实现中文最大逆向匹配分词算法。 1. 实现过程 1.1 读取字典 首先,我们需要准备一个字典文件以供分词使用。字典文件的每一行都是一个单。在读取字典文件时,我们可以使用Python中的open函数和readlines函数。 dictionary = [] with open('dictionary.txt', encoding='UTF-8') as file: for line in file: dictionary.append(line.strip()) 1.2 最大逆向匹配 在最大逆向匹配算法中,我们需要先设定一个最大匹配度max_len,以此来划定匹配范围。接下来,从往左选择一个度为max_len的子串,然后从字典中寻与该子串匹配的最语。如果到了匹配,便将该作为分割符号,并重新开始匹配。如果没有匹配,则将匹配度缩小一个字,重新匹配。 我们可以按照如下的方式实现最大逆向匹配算法: def reverse_max_match(sentence, dictionary, max_len): words = [] # 保存匹配结果 while sentence: # 只要有匹配完 for i in range(max_len, 0, -1): # 从最大度开始 if len(sentence) >= i: # 要保证有i个字符 if sentence[-i:] in dictionary: # 如果到了 words.append(sentence[-i:]) # 保存该 sentence = sentence[:-i] # 截掉已匹配 break # 重新开始新的匹配 else: # 没有匹配 words.append(sentence[-1]) # 直接将该作为分割符号 sentence = sentence[:-1] # 截掉已匹配的字符 return ' '.join(reversed(words)) # 因为是逆向匹配,所以要倒序排列 1.3 测试 最后,我们可以编写一个测试函数来测试分词算法的效果: def test(dictionary_file, sentence, max_len=5): dictionary = [] with open(dictionary_file, encoding='UTF-8') as file: for line in file: dictionary.append(line.strip()) result = reverse_max_match(sentence, dictionary, max_len) print('分词结果:', result) test('dictionary.txt', '我来到南京市江大桥。') # 分词结果: 我 来到 南京市 江大桥 。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值