开始写专栏了……

通过前缀字典树的方式实现添加节点,提取关键词并打标,可以处理部分分词任务,关键词提取任务,应用在搜索场景和文本信息抽取场景。

在专业性较强的文本关键词检测中有比较好的表现,但是在通用场景以及歧义较常见的场景无法达到目标,需要基于机器学习的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分词器相关推荐

  1. python核心装饰_Python核心编程 | 装饰器

    装饰器是程序开发的基础知识,用好装饰器,在程序开发中能够提高效率 它可以在不需要修改每个函数内部代码的情况下,为多个函数添加附加功能,如权限验证,log日志等 涉及点: 1.先梳理一下 >> ...

  2. python的网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

  3. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  4. python自带网页解析器_python 之网页解析器

    一.什么是网页解析器 1.网页解析器名词解释 首先让我们来了解下,什么是网页解析器,简单的说就是用来解析html网页的工具,准确的说:它是一个HTML网页信息提取工具,就是从html网页中解析提取出& ...

  5. python中文分词统计_python 实现中文分词统计

    总是看到别人用Python搞各种统计,前端菜鸟的我也来尝试了一把.有各种语义分析库在,一切好像并不是很复杂.不过Python刚开始看,估计代码有点丑. 一.两种中文分词开发包 thulac (http ...

  6. python什么是装饰器_python学习之装饰器是什么?

    学完python函数,接下来我们跟着猿人学python一起来看看什么是装饰器. 大家应该多多少少在其它地方有看过或是听过"装饰器"这个词.装饰器,顾名思义,就是用来装饰的,它装饰的 ...

  7. 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解

    本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先 ...

  8. python sqlite3事务_python使用上下文管理器实现sqlite3事务机制

    如题,本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制. 1.python上下文管理(with) python上下文管理(context),解决的是这样一类 ...

  9. [转载] 朴素贝叶斯python实现预测_Python实现朴素贝叶斯分类器的方法详解

    参考链接: Python朴素贝叶斯分类器 本文实例讲述了Python实现朴素贝叶斯分类器的方法.分享给大家供大家参考,具体如下: 贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进 ...

最新文章

  1. scau 1079 三角形(暴力)
  2. python编程入门指南pdf-python编程初学者指南
  3. Gentoo 安装日记 06 (格式化和挂载系统)
  4. 前端学习(3082):vue+element今日头条管理-页面布局
  5. valgrind 报告 ecpg内存泄露 (二)
  6. 用window.dialogArguments时出现window.dialogArguments is undefined
  7. java开发中的dorado_dorado7开发常用技巧及代码
  8. 2022年信息系统监理师考试大纲
  9. ORA-01653: 解决方案
  10. 网站服务器域名费用入什么科目,企业域名服务费记什么科目
  11. 单片机 - RTOS - Linux
  12. 无人机倾斜摄影技术应用(文末附作业指导书)
  13. linux看磁盘是sas还是sata吗,sas硬盘和sata硬盘区别能用在普通台式机上吗
  14. python怎么来算面积_python面积求法
  15. 接入网、承载网、核心网是什么,交换机路由器是什么、这个和网络的协议有什么关系呢?
  16. android手机获取手机设备信息
  17. Axure与markman
  18. android 帧动画监听,Android 动画(View动画,帧动画,属性动画)详细介绍
  19. 树莓派 可用于播放音频的三个软件
  20. 【C++】函数重载的使用及原理

热门文章

  1. 三种人工智能软件工具的应用场景和特点
  2. Python开发者的画笔-turtle
  3. “区块链+大数据”如何构建智慧城市生态圈
  4. 达人篇:6.3)试验设计DOE,Design of Experiments
  5. 学习笔记01-安全术语
  6. 股价日内模式中蕴藏的选股因子
  7. 以太坊的交易树和收据树
  8. 烤仔万花筒 | Bounty v2.0公测版上线
  9. 【重大发布】原生微信上架优麒麟软件商店
  10. android图文并排仿朋友圈,Android之仿微信发朋友圈图片选择功能