赞
踩
LAC是百度开发的离线的分词和词性标注库。
使用LAC之前,需要先安装LAC:
pip install lac -i https://mirror.baidu.com/pypi/simple
注意:LAC只支持Python3.7及以下的版本,不支持高版本。
这是一个基本的示例代码:
- from LAC import LAC
-
- # 装载LAC模型
- lac = LAC(mode='lac')
-
- # 单个样本输入,输入为Unicode编码的字符串
- text = u"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮"
- lac_result = lac.run(text)
- print(lac_result)
输出结果:
[['吃', '葡萄', '不', '吐', '葡萄皮', ',', '不', '吃', '葡萄', '倒', '吐', '葡萄皮'], ['v', 'n', 'd', 'v', 'n', 'w', 'd', 'v', 'n', 'd', 'v', 'n']]
可以看到,LAC不仅对句子进行了词性标注,还进行了分词。
它的词性标注的含义如下:
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
我们也可以使用API对多个句子进行词性标注,这样可以节省平均时间:
- from LAC import LAC
-
- # 装载LAC模型
- lac = LAC(mode='lac')
-
- # 多个样本输入,输入为Unicode编码的字符串
- text = [u"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮",
- u"python lac库可以实现精准定位分词"]
- lac_result = lac.run(text)
- print(lac_result)
输出:
[[['吃', '葡萄', '不', '吐', '葡萄皮', ',', '不', '吃', '葡萄', '倒', '吐', '葡萄皮'], ['v', 'n', 'd', 'v', 'n', 'w', 'd', 'v', 'n', 'd', 'v', 'n']], [['python', ' ', 'lac库', '可以', '实现', '精准', '定位', '分词'], ['nz', 'w', 'n', 'v', 'v', 'a', 'vn', 'n']]]
一个句子中有主要的词语,也有不重要的词语。主要的词语需要保留,而不重要的词语会影响自然语言处理。比如说这句话:
请你打开客厅的电视,我的智能助手
对于一个智能助手,很明显,这句话中,"请"、"你"、"的"、"我的智能助手"都不需要被保留,智能助手只需要知道"打开客厅电视"就可以了。我们可以通过标注词语的重要性来解决这个问题:
- from LAC import LAC
-
- # 装载LAC模型
- lac = LAC(mode='rank')
-
- # 单个样本输入,输入为Unicode编码的字符串
- text = u"请你打开客厅的电视,我的智能助手"
- lac_result = lac.run(text)
- print(lac_result)
输出:
[['请', '你', '打开', '客厅', '的', '电视', ',', '我', '的', '智能', '助手'], ['v', 'r', 'v', 'n', 'u', 'n', 'w', 'r', 'u', 'n', 'n'], [0, 1, 1, 3, 0, 2, 0, 1, 0, 3, 2]]
词性的重要性标签如下表:
标签 | 含义 | 常见于词性 |
---|---|---|
0 | query中表述的冗余词 | p, w, xc ... |
1 | query中限定较弱的词 | r, c, u ... |
2 | query中强限定的词 | n, s, v ... |
3 | query中的核心词 | nz, nw, LOC ... |
由于它是根据限定进行标注的,因此会将修饰成分的重要性标注的更大,不过问题不大。
我们可以根据这个输出结果提取主干:
- from LAC import LAC
-
- # 装载LAC模型
- lac = LAC(mode='rank')
-
- # 单个样本输入,输入为Unicode编码的字符串
- text = u"请你打开客厅的电视,我的智能助手"
- lac_result = lac.run(text)
- words = lac_result[0]
- parts = lac_result[1]
- levels = lac_result[2]
- for word, part, level in zip(words, parts, levels):
- if level > 1 or (level == 1 and part == 'v'): # 根据限定标注,因此可能有些重要的动词被标注的重要性较低
- print(word, part)
输出:
- 打开 v
- 客厅 n
- 电视 n
- 智能 n
- 助手 n
我们可以看到,"智能"和"助手"也被输出出来了,可是一个智能助手不需要在指令中听到"智能"、“助手”二字,因为这可能会导致判断失误(到底是打开电视还是智能助手)。
我们可以根据标点符号,将多个分句拆分,并且只处理有动词的分句:
- from LAC import LAC
-
- # 装载LAC模型
- lac = LAC(mode='rank')
-
- # 单个样本输入,输入为Unicode编码的字符串
- text = u"请你打开客厅的电视,我的智能助手"
- lac_result = lac.run(text)
- words = lac_result[0]
- parts = lac_result[1]
- levels = lac_result[2]
- for word, part, level in zip(words, parts, levels):
- if level > 1 or (level == 1 and part == 'v'): # 根据限定标注,因此可能有些重要的动词被标注的重要性较低
- print(word, part)
- if part == 'w':
- print("---")
可以看到,输出如下:
- 打开 v
- 客厅 n
- 电视 n
- ---
- 智能 n
- 助手 n
接下来只需要在智能助手的程序中,通过代码使其只处理有动词的分句即可。
我们可以通过这样的自然语言处理,实现一个智能助手。
这个智能助手应该能够根据输入的文字,自动排除干扰信息,执行正确的操作。
为此,我们的思路如下:
新建文件functions.py:
- def open(locate, obj):
- print(f"已打开在{locate}的{obj}")
-
-
- def close(locate, obj):
- print(f"已关闭在{locate}的{obj}")
新建文件words_list.py:
- import functions
-
- # 动词转操作
- oper = {
- "打开": functions.open,
- "启动": functions.open,
- "运行": functions.open,
- "关闭": functions.close,
- "关机": functions.close,
- "停止": functions.close
- }
新建文件main.py:
- from LAC import LAC
- import words_list
-
- # 装载LAC模型
- lac = LAC(mode='rank')
-
- text = input("请输入指令:")
- lac_result = lac.run(text)
- words = lac_result[0]
- parts = lac_result[1]
- levels = lac_result[2]
- locate = "无位置"
- obj = "无设备"
- function = None
-
- for word, part, level in zip(words, parts, levels):
- if level > 1 or (level == 1 and part == 'v'): # 根据限定标注,因此可能有些重要的动词被标注的重要性较低
- if part == 'v' and word in words_list.oper.keys(): # 提取操作动词
- function = words_list.oper[word]
- if part == 'n' and locate == "无位置": # 提取地点(认为位置在操作对象的前面)
- locate = word
- if part == 'n' and locate != "无位置": # 提取对象
- obj = word
- # 分句处理
- if part == 'w':
- if function is not None:
- function(locate, obj) # 调用功能函数
- # 重置信息
- locate = "无位置"
- obj = "无设备"
- function = None
-
- # 在最后调用功能函数
- if function is not None:
- function(locate, obj) # 调用功能函数
这样的话,我们就可以输入一些复杂的指令,智能助手也会正常地实现:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。