Python切分算法分几种,分别怎么实现
Admin 2022-05-30 群英技术资讯 882 次浏览
这篇文章将为大家详细讲解有关“Python切分算法分几种,分别怎么实现”的知识,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们需要分析某句话,就必须检测该条语句中的词语。
一般来说,一句话肯定包含多个词语,它们互相重叠,具体输出哪一个由自然语言的切分算法决定。常用的切分算法有完全切分、正向最长匹配、逆向最长匹配以及双向最长匹配。
本篇博文将一一介绍这些常用的切分算法。
完全切分是指,找出一段文本中的所有单词。
不考虑效率的话,完全切分算法其实非常简单。只要遍历文本中的连续序列,查询该序列是否在词典中即可。上一篇我们获取了词典的所有词语dic,这里我们直接用代码遍历某段文本,完全切分出所有的词语。代码如下:
from pyhanlp import *
def load_dictionary():
IOUtil = JClass('com.hankcs.hanlp.corpus.io.IOUtil')
path = HanLP.Config.CoreDictionaryPath.replace('.txt', '.mini.txt')
dic = IOUtil.loadDictionary([path])
return set(dic.keySet())
def fully_segment(text, dic):
list = []
for i in range(len(text)):
for j in range(i + 1, len(text) + 1):
temp = text[i:j]
if temp in dic:
list.append(temp)
return list
if __name__ == "__main__":
dic = load_dictionary()
print(fully_segment("在绝对实力面前,一切的说辞都是枉然", dic))

可以看到,完全切分算法输出了文本中所有的单字与词汇。
这里的算法原理是:开始遍历单个字,以该字为首,将后面每个字依次组合到单个字中,分析出这些组合字句是否在词典中。第二次,从第二个字开始,组合后面的字,以此类推。不懂的看下图就明白了。

虽然说完全切分能获取到所有出现在字典中的单词,单字,但是我们获取语句中单字一般来说没有任何意义,我们更希望获取的是中文分词,那种具有意义的词语序列。
比如,上面我们希望“绝对实力”成为一整个词,而不是“绝对”+“实力”之类的碎片。为了达到这个目的,我们需要完善一下我们的算法。考虑到越长的单词表达的意义更加的丰富,于是我们定义单词越长优先级越高。
具体来说,就是在某个下标为起点递增查词的过程中,优先输出更长的单词,这种规则被称为最长匹配算法。该下标的扫描顺序如果从前往后,则称为正向最长匹配,反之则为逆向最长匹配。
下面,我们来实现正向最长匹配,代码如下:
def forward_segment(text, dic):
list = []
i = 0
while i < len(text):
long_word = text[i]
for j in range(i + 1, len(text) + 1):
word = text[i:j]
if word in dic:
if len(word) > len(long_word):
long_word = word
list.append(long_word)
i += len(long_word)
return list
算法的原理:首先通过while循环判断i是否超出了字符串的大小,如果没有,获取当前第一个字符串为第一个最长匹配结果,接着遍历第一个字符串的所有可能组合结尾,如果在字典中,判断当前词语是否大于前面的最长匹配结果,如果是替换掉最长。遍历完成之后,将最长的结果添加到列表中,然后再获取第二字符,遍历所有结尾组合,获取最长匹配。以此类推。
既然了解了正向如何匹配,那么逆向算法应该也很好写。代码如下:
def backward_segment(text, dic):
list = []
i = len(text) - 1
while i >= 0:
long_word = text[i]
for j in range(0, i):
word = text[j:i + 1]
if word in dic:
if len(word) > len(long_word):
long_word = word
break
list.append(long_word)
i -= len(long_word)
return list
算法的原理:就是上面的正向反过来,但是这里并不是倒推文字,文字还是按语句的顺序,但是长度是从最长到最短,也就是遇到第一个就可以返回了添加了。比正向最长匹配算法节约时间。
虽然逆向比正向节约时间,但本身有一个很大的漏洞。假如我现在的句子中有一段“项目的”字符串,那么正向会出现“项目”,“的”两个词汇,而逆向会出现:“项”,“目的”两个词汇。
为此,我们的算法工程师提出了新的匹配规则,双向最长匹配。这是一种融合两种匹配方法的复杂规则,流程如下:
同时执行正向和逆向最长匹配,若两者的词数不同,则返回词数更少的一个否则,返回两者中单字更少的那一个。当单字也相同时,优先返回逆向最长匹配结果
具体代码如下:
#统计单字个数
def count_single_char(list):
return sum(1 for word in list if len(word) == 1)
#双向匹配算法
def bidirectional_segment():
f = forward_segment("在绝对实力面前,一切的说辞都是枉然", dic)
b = backward_segment("在绝对实力面前,一切的说辞都是枉然", dic)
if len(f) < len(b):
return f
elif len(f) > len(b):
return b
else:
if count_single_char(f)<count_single_char(b):
return f
else:
return b
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
相信不少朋友在刷朋友圈时,都会刷到下图所示的九宫格图片,感觉很酷炫的样子,那么这是怎么样做的呢?下面就给就大家分享一下Python生成这样一个九宫格图片的代码。
PIL网上有很多介绍,这里不再讲解。直接操作,读取一张图片,将其转换为灰度图像,并打印出来。
opencv矩形轮廓矫正怎样实现,及相关问题怎样解决,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
在Python中,字符串前面我们经常看到会加一些前缀,例如u、r、b、f。这篇文章将带大家简单了解一下字符串前加r(R)或u/(U)的前缀的区别,快来跟随小编一起学习吧
这篇文章主要给大家分享python做三维图可视化的内容,这是学习tensorflow框架中遇到的知识,下文会使用到的定义函数选用的是将x和y封装,方便tensorflow求导,下面我们就来具体一些实现代码以及要注意的问题。
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008