中文分词--最大正向匹配算法python实现

最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描)。例如:词典中最长词为“中华人民共和国”共7个汉字,则最大匹配起始字数为7个汉字。然后逐字递减,在对应的词典中进行查找。

下面以“我们在野生动物园玩”为例详细说明一下正向与逆向最大匹配方法:

1、正向最大匹配法:

正向即从前往后取词,从7->1,每次减一个字,直到词典命中或剩下1个单字。

第1次:“我们在野生动物”,扫描7字词典,无

第2次:“我们在野生动”,扫描6字词典,无

。。。。

第6次:“我们”,扫描2字词典,有

扫描中止,输出第1个词为“我们”,去除第1个词后开始第2轮扫描,即:

第2轮扫描:

第1次:“在野生动物园玩”,扫描7字词典,无

第2次:“在野生动物园”,扫描6字词典,无

。。。。

第6次:“在野”,扫描2字词典,有

扫描中止,输出第2个词为“在野”,去除第2个词后开始第3轮扫描,即:

第3轮扫描:

第1次:“生动物园玩”,扫描5字词典,无

第2次:“生动物园”,扫描4字词典,无

第3次:“生动物”,扫描3字词典,无

第4次:“生动”,扫描2字词典,有

扫描中止,输出第3个词为“生动”,第4轮扫描,即:

第4轮扫描:

第1次:“物园玩”,扫描3字词典,无

第2次:“物园”,扫描2字词典,无

第3次:“物”,扫描1字词典,无

扫描中止,输出第4个词为“物”,非字典词数加1,开始第5轮扫描,即:

第5轮扫描:

第1次:“园玩”,扫描2字词典,无

第2次:“园”,扫描1字词典,有

扫描中止,输出第5个词为“园”,单字字典词数加1,开始第6轮扫描,即:

第6轮扫描:

第1次:“玩”,扫描1字字典词,有

扫描中止,输出第6个词为“玩”,单字字典词数加1,整体扫描结束。

正向最大匹配法,最终切分结果为:“我们/在野/生动/物/园/玩”

2、python代码实现

 1 # -*- coding: utf-8 -*-
 2 """
 3 Created on Thu Jul 19 08:57:56 2018
 4
 5 @author: Lenovo
 6 """
 7
 8 test_file = ‘train/train.txt‘#训练语料
 9 test_file2 = ‘test/test.txt‘#测试语料
10 test_file3 = ‘test_sc/test_sc_zhengxiang.txt‘#生成结果
11
12 def get_dic(test_file): #读取文本返回列表
13     with open(test_file,‘r‘,encoding=‘utf-8‘,) as f:
14         try:
15             file_content = f.read().split()
16         finally:
17             f.close()
18     chars = list(set(file_content))
19     return chars
20
21 dic = get_dic(test_file)
22 def readfile(test_file2):
23     max_length = 5
24
25     h = open(test_file3,‘w‘,encoding=‘utf-8‘,)
26     with open(test_file2,‘r‘,encoding=‘utf-8‘,) as f:
27         lines = f.readlines()
28
29     for line in lines:#分别对每行进行正向最大匹配处理
30         max_length = 5
31         my_list = []
32         len_hang = len(line)
33         while len_hang>0 :
34             tryWord = line[0:max_length]
35             while tryWord not in dic:
36                 if len(tryWord)==1:
37                     break
38                 tryWord=tryWord[0:len(tryWord)-1]
39             my_list.append(tryWord)
40             line = line[len(tryWord):]
41             len_hang = len(line)
42
43         for t in my_list:#将分词结果写入生成文件
44             if t == ‘\n‘ :
45                 h.write(‘\n‘)
46             else:
47                 h.write(t + "  ")
48
49     h.close()
50
51 readfile(test_file2)

3、训练语料和测试语料见附件。

原文地址:https://www.cnblogs.com/Jm-15/p/9403352.html

时间: 2024-10-08 10:42:37

中文分词--最大正向匹配算法python实现的相关文章

NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching

最近接触NLP中文分词, 在lunr.js的基础上, 实现了中文的最大正向匹配分词. 某些情况下, 我们在服务器端进行中文文本分词可以使用完整的基于mmseg算法的分词模块, 例如nodejieba, node-segment, 盘古分词等等,  但是在客户端环境下, 我们不能使用这些复杂的分词算法进行分词, 这个时候可以根据已经生成的索引进行简单的客户端分词, 就是所说的FMM (Forward Maximum Matching, 正向最大匹配), 有时候也可以使用正向匹配. 在做FMM的时候

结巴中文分词使用学习(python)

中文分词工具:结巴分词 github地址:https://github.com/fxsjy/jieba 分词功能 精确模式(默认):试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成词的词语都扫描出来,但是不能解决歧义: 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细. 注意:jieba.cut以及jieba.cut_for_search返回的结构都是一个可迭代的 generator,并不是一个list列表.

NLP: 中文分词---正向匹配 (Forward Matching)

在采用FMM (正向最大匹配) 进行中文分词的时候, 可能会存在比较多的交集歧义, 这个时候为了解决交集歧义的问题, 可以采用 FM (Forwar Matching, 正向匹配) 进行中文分词, 正向匹配会在最大匹配的路径上查找所有可能成词的term(这里所有可能成词的term的意思是在构建索引的时候所有切分出来的词, 因为不是路径上的所有节点都会是切分成的词). http://blog.csdn.net/watkinsong/article/details/37696389 这个文章中给出了

中文分词常用算法之基于词典的正向最大匹配

算法描述: S1为带切分字符串,S2为空,MaxLen为词典中的最大词长 判断S1是否为空,若是则输出S2 从S1左边开始,取出待处理字符串str(其中str的长度小于MaxLen) 查看str是否在词典中,若是则转5,若否则转6 S2+=str+”/”,S1-=str,转2 将str最右边的一个字去掉 判断str是否为单字,若是则转5,若否则转4 Java实现代码: 1 public static List<String> FMM(String text) { 2 List<Strin

深度解析中文分词器算法(最大正向/逆向匹配)

中文分词算法概述: 1:非基于词典的分词(人工智能领域) 相当于人工智能领域计算.一般用于机器学习,特定领域等方法,这种在特定领域的分词可以让计算机在现有的规则模型中, 推理如何分词.在某个领域(垂直领域)分词精度较高.但是实现比较复杂. 例:比较流行的语义网:基于本体的语义检索. 大致实现:用protege工具构建一个本体(在哲学中也叫概念,在80年代开始被人工智能),通过jena的推理机制和实现方法. 实现对Ontology的语义检索. Ontology语义检索这块自己和一朋友也还在琢磨,目

python 读写txt文件并用jieba库进行中文分词

python用来批量处理一些数据的第一步吧. 对于我这样的的萌新.这是第一步. #encoding=utf-8 file='test.txt' fn=open(file,"r") print fn.read() fn.close() 在控制台输出txt文档的内容,注意中文会在这里乱码.因为和脚本文件放在同一个地方,我就没写路径了. 还有一些别的操作. 这是文件open()函数的打开mode,在第二个参数中设置.特别需要注意一下.具体还有一些别的细节操作. http://www.jb51

[python] 使用Jieba工具中文分词及文本聚类概念

声明:由于担心CSDN博客丢失,在博客园简单对其进行备份,以后两个地方都会写文章的~感谢CSDN和博客园提供的平台.        前面讲述了很多关于Python爬取本体Ontology.消息盒InfoBox.虎扑图片等例子,同时讲述了VSM向量空间模型的应用.但是由于InfoBox没有前后文和语义概念,所以效果不是很好,这篇文章主要是爬取百度5A景区摘要信息,再利用Jieba分词工具进行中文分词,最后提出文本聚类算法的一些概念知识.        相关文章:        [Python爬虫]

中文分词——正向最大匹配法

中文分词应用很广泛,网上也有很多开源项目.我在这里主要讲一下中文分词里面算法的简单实现,废话不多说了,现在先上代码 package com; import java.util.ArrayList; import java.util.List; public class Segmentation1 { private List<String> dictionary = new ArrayList<String>(); private String request = "北京

Python分词模块推荐:jieba中文分词

一.结巴中文分词采用的算法 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合 对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法 二.结巴中文分词支持的分词模式 目前结巴分词支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析: 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义: 搜索引擎模式,在精确模式的基础上,对长词