python分词器_python实现TriedTree分词器
开始写专栏了……
通过前缀字典树的方式实现添加节点,提取关键词并打标,可以处理部分分词任务,关键词提取任务,应用在搜索场景和文本信息抽取场景。
在专业性较强的文本关键词检测中有比较好的表现,但是在通用场景以及歧义较常见的场景无法达到目标,需要基于机器学习的NER(命名实体识别)来实现。
贴一下代码吧,去掉注释 ,一共60行:
class Node(object):
"""
TriedTree节点
"""
def __init__(self, name):
"""
前缀树节点
:param name: 节点名,除了根节点是root 其他都是字符
"""
self.name = name
self.children = {}
self.is_word = False
self.tag = ""
class TriedTree(object):
"""
TriedTree
"""
def __init__(self):
self.root = Node("root")
def insert(self, word, tag):
"""
插入单词
:param word:单词
:return:
"""
if word == "":
return
word = list(word)
def do_insert(i, node):
"""
递归插入单词
:param i: 位置索引
:param node:字母节点
:return:
"""
if i == len(word):
node.is_word = True
node.tag = tag
return
sub_node = node.children.get(word[i])
if sub_node is None:
sub_node = Node(word[i])
node.children[word[i]] = sub_node
do_insert(i + 1, sub_node)
# char_val = word_list[0]
index = 0
first_node = self.root.children.get(word[index])
if first_node is None:
first_node = Node(word[index])
self.root.children[word[index]] = first_node
do_insert(index + 1, first_node)
def segment_word(self, sentence):
"""
检测关键词,分词并且打标
:param sentence:
:return:
"""
index = 0
result = []
if sentence == "":
return result
sentence = list(sentence)
def deep_first_search(i, node):
"""
深度优先搜索目标节点返回下标和节点标签
:param i:
:param node:
:return:
"""
# if node.children is None:
# return i
if i == len(sentence) and node.is_word:
return i, True, node.tag
if i == len(sentence) and not node.is_word:
return i, False, ""
sub_node = node.children.get(sentence[i])
if sub_node is None and node.is_word:
return i, True, node.tag
if sub_node is None and not node.is_word:
return i, False, ""
return deep_first_search(i + 1, sub_node)
while index < len(sentence):
first_node = self.root.children.get(sentence[index])
begin = index
index += 1
if first_node is None:
continue
end, success, tag = deep_first_search(index, first_node)
index = end
if not success:
continue
result.append({"word": "".join(sentence[begin:end]), "tag": tag, "begin": begin, "end": end})
return result
以及测试代码:
if __name__ == '__main__':
s = ["a",
"abc",
"def",
"kkk"]
tree = TriedTree()
for item in s:
tree.insert(item, "word")
tree.insert("a", "char")
for item in tree.segment_word("aaabcdefkkkkkkk"):
print("aaabcdefkkkkkkk"[item['begin']:item['end']], item["tag"])
输出结果
a char
a char
abc word
def word
kkk word
kkk word
可以注意到,因为是深度优先搜索,所以当前采用的是长字符串优先的方式。当检索到“abc”的时候 ,“a”的标签优先级降低。
至于没有在triedtree节点的字符,不妨丢弃,实际的专业领域中,非专业词汇,用处的确不大。
python分词器_python实现TriedTree分词器相关推荐
- python核心装饰_Python核心编程 | 装饰器
装饰器是程序开发的基础知识,用好装饰器,在程序开发中能够提高效率 它可以在不需要修改每个函数内部代码的情况下,为多个函数添加附加功能,如权限验证,log日志等 涉及点: 1.先梳理一下 >> ...
- python的网页解析器_python 之网页解析器
一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...
- python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上
Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...
- python自带网页解析器_python 之网页解析器
一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...
- python中文分词统计_python 实现中文分词统计
总是看到别人用Python搞各种统计,前端菜鸟的我也来尝试了一把.有各种语义分析库在,一切好像并不是很复杂.不过Python刚开始看,估计代码有点丑. 一.两种中文分词开发包 thulac (http ...
- python什么是装饰器_python学习之装饰器是什么?
学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...
- 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...
- python sqlite3事务_python使用上下文管理器实现sqlite3事务机制
如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制. 1.python上下文管理(with) python上下文管理(context),解决的是这样一类 ...
- [转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解
参考链接: Python朴素贝叶斯分类器 本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进 ...
最新文章
- scau 1079 三角形(暴力)
- python编程入门指南pdf-python编程初学者指南
- Gentoo 安装日记 06 (格式化和挂载系统)
- 前端学习(3082):vue+element今日头条管理-页面布局
- valgrind 报告 ecpg内存泄露 (二)
- 用window.dialogArguments时出现window.dialogArguments is undefined
- java开发中的dorado_dorado7开发常用技巧及代码
- 2022年信息系统监理师考试大纲
- ORA-01653: 解决方案
- 网站服务器域名费用入什么科目,企业域名服务费记什么科目
- 单片机 - RTOS - Linux
- 无人机倾斜摄影技术应用(文末附作业指导书)
- linux看磁盘是sas还是sata吗,sas硬盘和sata硬盘区别能用在普通台式机上吗
- python怎么来算面积_python面积求法
- 接入网、承载网、核心网是什么,交换机路由器是什么、这个和网络的协议有什么关系呢?
- android手机获取手机设备信息
- Axure与markman
- android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍
- 树莓派 可用于播放音频的三个软件
- 【C++】函数重载的使用及原理