代码先锋网 代码片段及技术文章聚合

分词算法--正向最大匹配和逆向最大匹配实现

本代码来源于《python自然语言处理实战 核心技术与算法》一书中逆向最大匹配算法实现:

假设已经有正向匹配算法源码,则可以将文档进行倒序处理,生成逆序文档,然后根据逆序词典,对逆序文档使用正向最大匹配法处理即可。同理已经存在逆向最大匹配算法,则只要将文档倒序处理,正向词典倒序变为逆序词典,则可以送入逆向西大匹配算法中进行分词处理。

 

class IMM(object):
    def __init__(self, dic_path, reversed_match = True):
        self.dictionary = set()
        self.maximun = 0
        self.reversed_match = reversed_match
        with open(dic_path, "r", encoding="utf-8-sig") as f:
            for line in f:
                line = line.strip()
                if not line:
                    continue
                if self.reversed_match:          #choose reverse maximum match method
                    self.dictionary.add(line)
                else:                           #choose maximum match method
                    self.dictionary.add(line[::-1])
                if len(line) > self.maximun:
                    self.maximun = len(line)
        #print(self.dictionary)
    
    def cut(self, text):
        
        if self.reversed_match:
            text = text
        else:
            text = text[::-1]
            
        index = len(text)
        result = []   #store tokenizer result
        while index > 0:
            word = []
            for size in range(self.maximun, 0, -1):
                if index < size:
                    continue
                piece = text[(index - size): index]
                if piece in self.dictionary:
                    word = piece
                    if self.reversed_match:
                        result.append(word)
                    else:
                        result.append(word[::-1])
                    index -= size
                    break
            if not word:
                index -= 1
        if self.reversed_match:
            return result[::-1]
            
        else:
            return  result
path = r"E:\\学习相关资料\\python自然语言处理实战核心技术与算法--代码\\第三章"
doc = r"imm_dic.txt"
text = "南京市长江大桥"
doc_in_path = path + "\\" + doc
tokenizer = IMM(doc_in_path)
print(tokenizer.cut(text))

tokenizer = IMM(doc_in_path, reversed_match=False)
print(tokenizer.cut(text))

 其中,imm_dic.txt内容为:

南京市
南京市长
长江大桥
人民解放军
大桥
江大桥

 

这里,将字符串反转的实现方式是:

x = "hello world"
z = x[::-1]
print(z)

将字符串逐字符反转

 

在打开文件处,

encoding="utf-8-sig"
encoding="utf-8"

主要是发现

dic = []
with open(doc_in_path, "r", encoding="utf-8-sig") as f:
    for line in f:
        line = line.strip()
        if line:
            dic.append(line)
print(dic)


['南京市', '南京市长', '长江大桥', '人民解放军', '大桥', '江大桥']
dic = []
with open(doc_in_path, "r", encoding="utf-8") as f:
    for line in f:
        line = line.strip()
        if line:
            dic.append(line)
print(dic)

['\ufeff南京市', '南京市长', '长江大桥', '人民解放军', '大桥', '江大桥']

"\ufeff"的存在,限制我只能使用“utf-8-sig”

 

 

版权声明:本文为z2539329562原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/z2539329562/article/details/87095533

智能推荐

中文分词之正向最大匹配算法

中文分词目前可以分为“规则分词”,“统计分词”,“混合分词(规则+统计)”这三个主要流派。这次介绍下基于规则的分词,其是一种机械的分词方法,主要通过维护词典,在切分语句时,将语句的每个字符串与词表中的词逐一进行匹配,找到则切分,否则不予切分。 正向最大匹配算法:这里需要知道两点,一个是分词词典(也即是已经分词过的词典),另一个...

NLP 正向最大匹配、逆向最大匹配与双向匹配算法实现

分词词典: 分词结果: 分词结果: 调用以上函数实现双向匹配: 分词结果:...

python 实现机械分词(1)-正向最大匹配算法

        词语是自然语言处理中重要的知识载体和基本操作单元, 但是中文里词与词之间没有很明显的标记,它们都是连续的字符串,所以文本处理的第一步是怎样进行中文分词。分词是添加合适的显性的词语边界标志使得所形成的词串反映句子的本意的过程。分词主要有基于字符串匹配的方法、基于规则的方法和基于统计的方法,本文主要通过python实现基于字符串匹配的方法也称为机...

Python---正向、逆向和双向最大匹配算法

使用python实现正向、逆向和双向最大匹配算法 正向最大匹配 逆向最大匹配 双向最大匹配 完!...

Java---正向、逆向和双向最大匹配算法

完成正向、逆向和双向最大匹配算法 运行结果 完!...

猜你喜欢

中文分词算法:逆向最大匹配法

1、词典 ./data/rmm_dic.utf8 2、RMM算法 执行结果 程序解析: 1、初始值     待切分字符串长度index =7     最大词典长度maximum=5 2、第1次大循环while  index =7  (1)第1次for循环    size...

简单的逆向最大匹配算法实现中文分词(Python)

Python实现逆向最大匹配中文分词,注意的是作为词典的文件编码格式应该为utf-8....

【Python】实现正向(逆向)最大匹配法(中文分词,NLP,编译原理)

正向最大匹配法(Maximum Match Method) Step 1 假定分词词典中的最长词有i个汉字字符,则用被处理的当前字串中的前i个字作为匹配字段,查找字典。 Step 2 若字典中存在这样一个i字词,则匹配成功;否则,失败,将匹配字段中的最后一个字符去掉, 对剩下字串进行匹配。 Step 3 如此进行下去,直到匹配成功,即切分出一个词或剩余字串长度为0。 不停的匹配,直到文档被扫描完为...

中文分词--逆向最大匹配

词典和匹配的字符串都和上一篇文章同样 仅仅是本算法是从后到前搜索字符串。然后找到最长的匹配结果输出。 上代码 能够看到执行结果是:北京/大学生/前来/应聘/ 分词效果非常好...