机器学习项目(二) 人工智能辅助信息抽取(二)

AC自动机与正则表达式

字符串搜索算法,用于在输入的一串字符串中匹配有限组"字典"中的子串。它与普通字符串匹配的不同点在于同时与所有字典串进行匹配。算法均摊情况下具有近似于线性的时间复杂度,约为字符串的长度加所有匹配的数量

KMP算法

KMP算法核心为部分匹配表,记录字符串中的前缀集合与后缀集合的交集中最长元素的长度。根据部分匹配表,可避免重复检查先前匹配的元素。

Trie 树

trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

AC自动机原理

AC自动机 = KMP+Trie树

依靠构造一个有限状态机(类似于在一个trie树中添加失配指针)来实现。这些额外的失配指针允许在查找字符串失败时进行回退(例如设Trie树的单词cat匹配失败,但是在Trie树中存在另一个单词cart,失配指针就会指向前缀ca),转向某前缀的其他分支,免于重复匹配前缀,提高算法效率。

调用开源pyahocorasick进行匹配



import ahocorasick as ah
A = ah.Automaton()
words = ['口服','注射','皮下注射','腹腔注射','静脉','静脉注射','静滴','CSII']
for idx , key in enumerate(words):
    A.add_word(key,(idx,key))
A.make_automaton()
haystack = '胰岛素强化治疗方案包括基础-餐食胰岛素治疗方案[多次皮下注射胰岛素或持续皮下胰岛素输注(CSII)]或预混胰岛素每天注射'
for end_index ,(insert_order,original_value) in A.iter(haystack):
    start_index = end_index - len(original_value)+1
    print(start_index,end_index+1,original_value)
    assert haystack[start_index:start_index+len(original_value)] == original_value

正则表达式

原理:NFA自动机(Non deterministic Finite Automaton 不确定型有穷自动机)。NFA是以正则表达式为基准去匹配的,发现不匹配了。此时就会发生回溯
正则里面NFA引擎实际上就是在语法解析的时候,构造出的一个有向图,然后通过深度的方式,去一条路径一条路径的递归尝试。
优点 功能强大,可以拿到匹配的上下文信息,支持各种断言捕获组环视之类的功能
缺点 对开发正则功底要求较高,需要注意回溯造成的性能问题

基于规则的信息抽取

机器学习项目(二) 人工智能辅助信息抽取(二)_第1张图片

NER研究进展

机器学习项目(二) 人工智能辅助信息抽取(二)_第2张图片

你可能感兴趣的:(机器学习实战)