NLP入门学习1——分词和词性标注

  • 0.简介
  • 1.概念和工具
    • 1.1 词性标注
    • 1.2 NLTK
    • 1.3 jieba
    • 1.4 LAC
  • 2.代码实现
    • 2.1 分词
      • 2.1.1 使用nltk进行分词:
      • 2.1.2 使用jieba进行分词
      • 2.1.3 使用LAC进行分词
    • 2.2 词性标注
      • 2.2.1 使用nltk工具实现词性标注
      • 2.2.2 使用LAC工具实现词性标注
  • 3.遇到的问题及解决
    • 3.1 Resource punkt not found
  • 4.结束

0.简介

本文主要介绍NLP中最基础的任务分词和词性标注。难度属于入门级别。
本文的主要参考如下:
参考链接1
参考链接2
参考链接3
参考链接4

1.概念和工具

1.1 词性标注

词性标注是NLP四大基本任务中序列标注中的一项,其目的是对文本中的词汇实现词性的划分。标注的结果是一个由二元组组成的list,其中每一个二元组中标明了每个token对应的词性。

1.2 NLTK

NLTK全称natural language toolkit是一个基于python编写的自然语言处理工具箱。
安装非常简单,直接用conda或者pip安装即可。

conda install nltk

在nltk中,将词性归为以下类别:

简写 全称 含义
CC coordinating conjunction 并列连词
CD cardinal digit 基数
DT determiner 限定词
EX existentialthere 存在句
FW foreignword 外来语
IN preposition/subordinating conjunction 介词/从属连词
JJ adjective 形容词
JJR adjective, comparative 比较级形式
JJS adjective, superlative 最高级
MD modal 情态动词
NN noun 名词单数形式
NNS noun 名词复数形式
NNP propernoun 专有名词单数形式
NNPS propernoun 专有名词复数形式
PDT predeterminer 前位限定词
POS possessiveending 属有词’s
PRP personalpronoun 人称代词
PRP$ possessive pronoun 物主代词
RB adverb very 副词
RBR adverb,comparative 副词比较级
RBS adverb,superlative 副词最高级
RP particle 与动词构成短语的副词或介词
TO to to
UH interjection 感叹词
VB verb 动词
VBD verb 动词过去式
VBG verb 现在分词
VBN verb 过去分词
VBP verb 动词现在
VBZ verb 动词 第三人称
WDT wh-determiner 限定词which等
WP wh-pronoun 代词who, what 等
WP$ possessivewh-pronoun 所有格 whose
WRB wh-abverb where, when 副词

1.3 jieba

jieba是一个优秀的中文分词库,同样是基于python。
支持精确模式,全模式,搜索引擎模式等多种模式。
Github:jieba

jieba安装可以在conda命令行通过如下指令完成:

conda install --channel https://conda.anaconda.org/conda-forge jieba

1.4 LAC

LAC全称Lexical Analysis of Chinese,是百度自然语言处理部研发的一款联合的词法分析工具,实现中文分词、词性标注、专名识别等功能。
GitHub:LAC
LAC的安装也非常简单:

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

在词性标注任务中,LAC将词性归为以下类:

2.代码实现

2.1 分词

分词可以使用nltk实现,也可以使用其他工具如jieba实现。
使用nltk工具进行分词可以直接由文本到token划分,也可以先进行sentence level的分词。

2.1.1 使用nltk进行分词:

(1)直接划分

words = nltk.word_tokenize(text)
words

结果:

Out[1]: ['life', 'is', 'short', '.', 'play', 'more', 'sport', '.']

(2)先进行句子划分:

import nltk
text = 'life is short. play more sport.'
sents = nltk.sent_tokenize(text)
sents

结果:

Out[1]: ['life is short.', 'play more sport.']

再进行分词:

words = [nltk.word_tokenize(i) for i in sents]
words

结果:

Out[1]: [['life', 'is', 'short', '.'], ['play', 'more', 'sport', '.']]

但没有加载中文语料库的情况下,试图使用nltk进行中文分词就会出现问题:

words = nltk.word_tokenize('吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮')
words

结果可以看出分词并没有成功:

['吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮']

接下来就介绍可以用于中文分词的工具。

2.1.2 使用jieba进行分词

jieba的分词功能可以由两个函数实现,cut函数返回的是一个generator,lcut函数直接返回一个list,具体的使用方法:
(1) cut:

import jieba
import jieba.analyse
words = jieba.cut(text)
print('/'.join(words))

结果:

 life/ /is/ /short/./ /play/ /more/ /sport/.

(2) lcut:

words = jieba.lcut(text)
print(words)

结果:

 ['life', ' ', 'is', ' ', 'short', '.', ' ', 'play', ' ', 'more', ' ', 'sport', '.']

在这里可以看出jieba分词与nltk之间的一个区别在于,jieba的分词结果中把空格也包含进去了,不限要空格的话就把它删掉就好了。

words = jieba.lcut(text)
while ' ' in words:words.remove(' ')
print(words)

结果:

['life', 'is', 'short', '.', 'play', 'more', 'sport', '.']

jieba除了可以进行英文分词,也可以进行中文分词。

words = jieba.lcut('吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮')
words

结果:

['吃', '葡萄', '不吐', '葡萄', '皮', ',', '不吃', '葡萄', '倒', '吐', '葡萄', '皮']

2.1.3 使用LAC进行分词

使用LAC进行分词也很简单,下面是LAC官方的操作指引和样例结果。

from LAC import LAC# 装载分词模型
lac = LAC(mode='seg')# 单个样本输入,输入为Unicode编码的字符串
text = "LAC是个优秀的分词工具"
seg_result = lac.run(text)# 批量样本输入, 输入为多个句子组成的list,平均速率会更快
texts = ["LAC是个优秀的分词工具", "百度是一家高科技公司"]
seg_result = lac.run(texts)

结果:

【单样本】:seg_result = [LAC, 是, 个, 优秀, 的, 分词, 工具]
【批量样本】:seg_result = [[LAC, 是, 个, 优秀, 的, 分词, 工具], [百度, 是, 一家, 高科技, 公司]]

2.2 词性标注

2.2.1 使用nltk工具实现词性标注

pos_tags =nltk.pos_tag(words)
print(pos_tags)

结果:

[('life', 'NN'), ('is', 'VBZ'), ('short', 'JJ'), ('.', '.'), ('play', 'VB'), ('more', 'JJR'), ('sport', 'NN'), ('.', '.')]

可以看出在英文分词方面nltk工具的效果还是很准确,很精细的。

上文中提到nltk在中文分词中不灵了,那么如果将分好的token输入给nltk,是否能够完成词性标注了?

words = jieba.lcut('吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮')
pos_tags =nltk.pos_tag(words)
pos_tags

结果:

[('吃', 'JJ'),('葡萄', 'NNP'),('不吐', 'NNP'),('葡萄', 'NNP'),('皮', 'NNP'),(',', 'NNP'),('不吃', 'NNP'),('葡萄', 'NNP'),('倒', 'NNP'),('吐', 'NNP'),('葡萄', 'NNP'),('皮', 'NN')]

尽管标注完成了,但是通过判断发现它的标注并不准确,把“吃”标注成了形容词,“不吐”标注成了名词。

2.2.2 使用LAC工具实现词性标注

from LAC import LAC# 装载LAC模型
lac = LAC(mode='lac')# 单个样本输入,输入为Unicode编码的字符串
text = u"LAC是个优秀的分词工具"
lac_result = lac.run(text)# 批量样本输入, 输入为多个句子组成的list,平均速率更快
texts = [u"LAC是个优秀的分词工具", u"百度是一家高科技公司"]
lac_result = lac.run(texts)

结果:

【单样本】: lac_result = ([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n])
【批量样本】:lac_result = [([百度, 是, 一家, 高科技, 公司], [ORG, v, m, n, n]),([LAC, 是, 个, 优秀, 的, 分词, 工具], [nz, v, q, a, u, n, n])]

再来测试一下我们自己的例子:

from LAC import LAC# 装载LAC模型
lac = LAC(mode='lac')# 单个样本输入,输入为Unicode编码的字符串
text = u"吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮"
lac_result = lac.run(text)

结果:

[['吃', '葡萄', '不', '吐', '葡萄皮', ',', '不', '吃', '葡萄', '倒', '吐', '葡萄皮'],['v', 'nz', 'd', 'v', 'n', 'w', 'd', 'v', 'n', 'd', 'v', 'n']]

结果同样十分准确,并且相比jieba分词的结果,吧“葡萄皮”作为一个整体保留下来了。

3.遇到的问题及解决

3.1 Resource punkt not found

使用nltk分词时,报错LookupError Resource punkt not found,按照提示下载,nltk.download(‘punkt’),提示failed。
这是因为资源在外网,所以访问不了。解决方法,手动下载,并保存在指定位置.
下载链接在git上还有很多人的博客上都可以找到,为了防止失效,我又在自己的网盘里传了一个。
地址:https://pan.baidu.com/s/14KpU-BNuST6IwAFhWOosBA 提取码:s8zt

下载之后把缺少的包放在自动搜索的路径下,如各盘的根目录,在这里我把它放在了anaconda的路径下。
在…\anaconda\share路径下创建文件夹nltk_data,以punkt为例,把下载的数据解压,把punkt中的english.pickle 放在…\anaconda\share\nltk_data\tokenizers\punkt\PY3\english.pickle,就可以了。
有一个细节需要注意一下,在解压之后的文件夹中并没有包含名为PY3的文件夹,如果不自己创建一个的话,仍然会报错。
类似的问题也采用类似的解决方法。

如果以上的内容中出现了任何错误和不准确的地方,还请帮忙指出,谢谢。

4.结束

接下来的一段时间里,我会从最基础的内容开始NLP的学习,主要会记录一些基本的概念和NLP工具和模型在使用的过程中遇到的问题。那么我们下期再见。

NLP入门学习1——分词和词性标注相关推荐

  1. NLP入门学习3——句法分析(基于LTP4)

    NLP入门学习3--句法分析(基于LTP4) 0.简介 1.LTP介绍 2.安装 2.1 模块安装 2.2 模型下载 3.使用 3.1 分句 3.2 分词 3.3 词性标注 3.4 命名实体识别 3. ...

  2. 【AI实战】大语言模型(LLM)有多强?还需要做传统NLP任务吗(分词、词性标注、NER、情感分类、知识图谱、多伦对话管理等)

    [AI实战]大语言模型(LLM)有多强?还需要做传统NLP任务吗(分词.词性标注.NER.情感分类.多伦对话管理等) 大语言模型 大语言模型有多强? 分词 词性标注 NER 情感分类 多伦对话管理 知 ...

  3. NLP入门(1)-词典分词方法及实战

    分词是自然语言处理中最基本的任务之一,而词典分词是最简单.最常见的分词算法,仅需一部词典和一套查词典的规则即可. 利用词典分词,最主要的是定制合适的切分规则.规则主要有正向最长匹配.逆向最长匹配和双向 ...

  4. 研一学习笔记-小白NLP入门学习笔记

    ⭐️我叫恒心,一名喜欢书写博客的研究生在读生. 原创不易~转载麻烦注明出处 1 前言 离研究生新生开学还有一个月左右的时间了欧,相信研0的小伙伴们,或多或少都会有这么一段迷茫期,如果你即将从事自然语言 ...

  5. 自然语言处理(NLP)学习笔记——分词工具词性对照表

    jieba词性对照表: - a 形容词 - ad 副形词 - ag 形容词性语素 - an 名形词 - b 区别词 - c 连词 - d 副词 - df - dg 副语素 - e 叹词 - f 方位词 ...

  6. python语言处理初探——分词、词性标注、提取名词

    这个教程里我们只需要调库,不需要了解原理,很简单的 参考文章: 参考:Python NLTK 自然语言处理入门与例程 参考1:NLP入门学习1--分词.词性标注 - CSDN博客 参考2:使用nltk ...

  7. standfordcorenlp在python环境下的使用(中文分词、词性标注、命名实体分析、解析语法、解析语法关系)

    操作环境:windows 需求:安装PyCharm.JDK1.8 第一步: 首先从stanford NLP网页下载两个包,分别是stanford-corenlp-full-2018-10-05.zip ...

  8. 系统学习NLP(三)--NLP入门综述

    从这个月开始,进入NLP方向了,因此,系统了看了一遍<自然语言处理综论>,对NLP做了点系统性的了解,后面抽时间一个一个业务或者方向进行实现学习.这里主要是入门的认识,因此,大多数不涉及每 ...

  9. NLP入门之综述阅读-基于深度学习的自然语言处理研究综述

    NLP入门-综述阅读-[基于深度学习的自然语言处理研究综述] 基于深度学习的自然语言处理研究综述 摘要 0 引言 1 深度学习概述 卷积神经网络 递归神经网络 2 NLP应用研究进展 3 预训练语言模 ...

最新文章

  1. 外卖平台涉嫌大数据杀熟,处理不能“自说自话”
  2. 参考例子,学习FuncT, TResult委托
  3. 计算机网络 HTTP工作机制 TCP三次握手四次挥手 TCP滑动窗口
  4. windows和linux如何通信,别总是把Windows和Linux混为一谈
  5. 关于Unable to load annotation processor factory 的故障
  6. 图灵程序设计丛书 算法(第4版)pdf
  7. matlab赌徒破产模型转移矩阵,基于matlab的土地利用转移矩阵及土地利用转移空间分布...
  8. 7440 GT540
  9. 7寸显示器 树莓派4b_树莓派7寸触摸屏安装指南
  10. java publisher_Combine -- 常见的 Publisher 及 Operator
  11. 纯CSS3 3D图片向上翻转渐隐消失动画DEMO演示
  12. 身边已经消失或走在消失路上的可爱小动物
  13. 看完这4个项目还不懂 数据分析,就把电脑砸了吧!
  14. Outlook登录163邮箱,qq邮箱以及企业邮箱等邮箱
  15. (原创)直观了解通道混和器的校色作用
  16. 阿里大数据ACP认证对找工作到底有用嘛?
  17. 19.调整数组奇偶数
  18. 家族关系查询系统程序设计算法思路_数据结构课程设计家族关系查询系统要点...
  19. Hex Tech,一个带编程协同能力的 BI 平台的“危”与“机”
  20. 上课点名app Android,Android开发高校点名签到app之启动页(1)

热门文章

  1. 记录-几个常用的软件工具,非常实用
  2. 联想td350服务器做系统,关于联想TD350服务器硬装CentOS操作系统注意事项.docx
  3. shell脚本——expect的综合使用(包含应用案例)
  4. 打造快时尚下的柔性供应链
  5. DUMP文件分析1:DUMP文件简介
  6. 亚马逊工具选品Jungle Scout正版插件和破解版的区别
  7. 南大通用&河北工业大学人工智能与数据科学学院党支部共建暨研究生培养基地合作签约仪式顺利举办
  8. c++中find() 函数与string::npos参数
  9. c 定义字符串类型变量_C字符串变量类型
  10. 摄影视觉运用于网页设计