当前位置:   article > 正文

Python使用LAC进行词性标注_import lac

import lac

LAC是百度开发的离线的分词和词性标注库。

安装

使用LAC之前,需要先安装LAC:

pip install lac -i https://mirror.baidu.com/pypi/simple

注意:LAC只支持Python3.7及以下的版本,不支持高版本。

基本使用

 这是一个基本的示例代码

  1. from LAC import LAC
  2. # 装载LAC模型
  3. lac = LAC(mode='lac')
  4. # 单个样本输入,输入为Unicode编码的字符串
  5. text = u"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮"
  6. lac_result = lac.run(text)
  7. 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对多个句子进行词性标注,这样可以节省平均时间:

  1. from LAC import LAC
  2. # 装载LAC模型
  3. lac = LAC(mode='lac')
  4. # 多个样本输入,输入为Unicode编码的字符串
  5. text = [u"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮",
  6. u"python lac库可以实现精准定位分词"]
  7. lac_result = lac.run(text)
  8. 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']]]

词语重要性

一个句子中有主要的词语,也有不重要的词语。主要的词语需要保留,而不重要的词语会影响自然语言处理。比如说这句话:

请你打开客厅的电视,我的智能助手

对于一个智能助手,很明显,这句话中,"请"、"你"、"的"、"我的智能助手"都不需要被保留,智能助手只需要知道"打开客厅电视"就可以了。我们可以通过标注词语的重要性来解决这个问题:

  1. from LAC import LAC
  2. # 装载LAC模型
  3. lac = LAC(mode='rank')
  4. # 单个样本输入,输入为Unicode编码的字符串
  5. text = u"请你打开客厅的电视,我的智能助手"
  6. lac_result = lac.run(text)
  7. 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 ...

 由于它是根据限定进行标注的,因此会将修饰成分的重要性标注的更大,不过问题不大。

我们可以根据这个输出结果提取主干:

  1. from LAC import LAC
  2. # 装载LAC模型
  3. lac = LAC(mode='rank')
  4. # 单个样本输入,输入为Unicode编码的字符串
  5. text = u"请你打开客厅的电视,我的智能助手"
  6. lac_result = lac.run(text)
  7. words = lac_result[0]
  8. parts = lac_result[1]
  9. levels = lac_result[2]
  10. for word, part, level in zip(words, parts, levels):
  11. if level > 1 or (level == 1 and part == 'v'): # 根据限定标注,因此可能有些重要的动词被标注的重要性较低
  12. print(word, part)

输出:

  1. 打开 v
  2. 客厅 n
  3. 电视 n
  4. 智能 n
  5. 助手 n

我们可以看到,"智能"和"助手"也被输出出来了,可是一个智能助手不需要在指令中听到"智能"、“助手”二字,因为这可能会导致判断失误(到底是打开电视还是智能助手)。 

分句拆分

我们可以根据标点符号,将多个分句拆分,并且只处理有动词的分句:

  1. from LAC import LAC
  2. # 装载LAC模型
  3. lac = LAC(mode='rank')
  4. # 单个样本输入,输入为Unicode编码的字符串
  5. text = u"请你打开客厅的电视,我的智能助手"
  6. lac_result = lac.run(text)
  7. words = lac_result[0]
  8. parts = lac_result[1]
  9. levels = lac_result[2]
  10. for word, part, level in zip(words, parts, levels):
  11. if level > 1 or (level == 1 and part == 'v'): # 根据限定标注,因此可能有些重要的动词被标注的重要性较低
  12. print(word, part)
  13. if part == 'w':
  14. print("---")

可以看到,输出如下:

  1. 打开 v
  2. 客厅 n
  3. 电视 n
  4. ---
  5. 智能 n
  6. 助手 n

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

举例——智能助手

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

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

为此,我们的思路如下:

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

新建文件functions.py:

  1. def open(locate, obj):
  2. print(f"已打开在{locate}{obj}")
  3. def close(locate, obj):
  4. print(f"已关闭在{locate}{obj}")

新建文件words_list.py:

  1. import functions
  2. # 动词转操作
  3. oper = {
  4. "打开": functions.open,
  5. "启动": functions.open,
  6. "运行": functions.open,
  7. "关闭": functions.close,
  8. "关机": functions.close,
  9. "停止": functions.close
  10. }

 新建文件main.py:

  1. from LAC import LAC
  2. import words_list
  3. # 装载LAC模型
  4. lac = LAC(mode='rank')
  5. text = input("请输入指令:")
  6. lac_result = lac.run(text)
  7. words = lac_result[0]
  8. parts = lac_result[1]
  9. levels = lac_result[2]
  10. locate = "无位置"
  11. obj = "无设备"
  12. function = None
  13. for word, part, level in zip(words, parts, levels):
  14. if level > 1 or (level == 1 and part == 'v'): # 根据限定标注,因此可能有些重要的动词被标注的重要性较低
  15. if part == 'v' and word in words_list.oper.keys(): # 提取操作动词
  16. function = words_list.oper[word]
  17. if part == 'n' and locate == "无位置": # 提取地点(认为位置在操作对象的前面)
  18. locate = word
  19. if part == 'n' and locate != "无位置": # 提取对象
  20. obj = word
  21. # 分句处理
  22. if part == 'w':
  23. if function is not None:
  24. function(locate, obj) # 调用功能函数
  25. # 重置信息
  26. locate = "无位置"
  27. obj = "无设备"
  28. function = None
  29. # 在最后调用功能函数
  30. if function is not None:
  31. function(locate, obj) # 调用功能函数

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

参考

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

项目概览 - lac - GitCode 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/588723
推荐阅读
相关标签
  

闽ICP备14008679号