Python使用LAC进行词性标注

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]]

词性的重要性标签如下表:

标签含义常见于词性
0query中表述的冗余词p, w, xc ...
1query中限定较弱的词r, c, u ...
2query中强限定的词n, s, v ...
3query中的核心词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

 接下来只需要在智能助手的程序中,通过代码使其只处理有动词的分句即可。

举例——智能助手

我们可以通过这样的自然语言处理,实现一个智能助手。

这个智能助手应该能够根据输入的文字,自动排除干扰信息,执行正确的操作。

为此,我们的思路如下:

  1. 创建一个模块,封装所有功能函数
  2. 创建一个字典,将动词转换为功能函数
  3. 根据词语重要性,提取实义动词(在字典里的动词)、地点(房间)、对象(智能家具,如电视、空调等)

新建文件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)  # 调用功能函数

这样的话,我们就可以输入一些复杂的指令,智能助手也会正常地实现:

参考

【NLP】自然语言处理_NLP入门——分词和词性标注_中文自认语言处理jieba词性标注-CSDN博客

项目概览 - lac - GitCode 

  • 21
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值