【NLP】自然语言处理_NLP入门——分词和词性标注

news2024/11/13 16:15:27

【NLP】自然语言处理_NLP入门——分词和词性标注

文章目录

  • 【NLP】自然语言处理_NLP入门——分词和词性标注
    • 1. 介绍
    • 2. 概念和工具
      • 2.1 分词
      • 2.2 词性标注
      • 2.3 NLTK
      • 2.4 Jieba
      • 2.5 LAC
    • 3. 代码实现+举例
      • 3.1 分词
        • 3.1.1 使用nltk进行分词
        • 3.1.2 使用jieba进行分词
        • 3.1.3 使用LAC进行分词
      • 3.2 词性标注
        • 3.2.1 使用 nltk 实现词性标注
        • 3.2.2 使用LAC实现词性标注
    • 4. 可能的问题及解决
        • 4.1 Resource punkt not found
    • 5. 参考


1. 介绍

NLP 四大任务:

  • 序列标注:分词,词性标注,命名实体识别
  • 分类任务:文本分类,情感计算
  • 句子关系判断:entailment(分类为蕴含或矛盾),相似度计算
  • 生成式任务:机器翻译,问答系统,文本摘要

本文主要介绍NLP中最基础的任务分词和词性标注。难度属于入门级别。


2. 概念和工具

2.1 分词

分词是 NLP 的重要步骤。

  • 分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。
  • 分词获得的就是由词语组成的 list,而不是原来的句子。

2.2 词性标注

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

2.3 NLTK

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

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple nltk
  • 在nltk中,将词性归为以下类别:
    在这里插入图片描述

2.4 Jieba

jieba是一个优秀的中文分词库,同样是基于python。

  • 支持精确模式,全模式,搜索引擎模式等多种模式。
  • Github:jieba

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

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

2.5 LAC

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

  • GitHub:LAC
    LAC的安装也非常简单:
pip install lac -i https://mirror.baidu.com/pypi/simple
  • 在词性标注任务中,LAC将词性归为以下类:
    在这里插入图片描述

3. 代码实现+举例

3.1 分词

分词可以使用nltk实现,也可以使用其他工具如jieba实现。

  • 使用nltk工具进行分词可以直接由文本到token划分,
  • 也可以先进行sentence level的分词。

3.1.1 使用nltk进行分词

1)直接划分:

words = nltk.word_tokenize(text)
words
  • 结果:['life', 'is', 'short', '.', 'play', 'more', 'sport', '.']

2)1. 先进行句子划分:

import nltk
text = 'life is short. play more sport.'
sents = nltk.sent_tokenize(text)
sents
  • 结果:['life is short.', 'play more sport.']

2)2. 再进行分词

words = [nltk.word_tokenize(i) for i in sents]
words
  • 结果:[['life', 'is', 'short', '.'], ['play', 'more', 'sport', '.']]

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

words = nltk.word_tokenize('吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮')
words
  • 结果可以看出,分词并没有成功:['吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮']

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


3.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', '.']

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

words = jieba.lcut('吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮')
words
  • 结果:['吃', '葡萄', '不吐', '葡萄', '皮', ',', '不吃', '葡萄', '倒', '吐', '葡萄', '皮']

3.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, 是, 个, 优秀, 的, 分词, 工具], [百度, 是, 一家, 高科技, 公司]]

3.2 词性标注

3.2.1 使用 nltk 实现词性标注

1)英文

pos_tags =nltk.pos_tag(words)
print(pos_tags)
  • 结果:[('life', 'NN'), ('is', 'VBZ'), ('short', 'JJ'), ('.', '.'), ('play', 'VB'), ('more', 'JJR'), ('sport', 'NN'), ('.', '.')]

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

2)中文
那么如果将分好的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')]

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

3.2.2 使用LAC实现词性标注

1)例子1

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

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

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 分词的结果,把“葡萄皮”作为一个整体保留下来了。

4. 可能的问题及解决

4.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的文件夹,如果不自己创建一个的话,仍然会报错。
类似的问题也采用类似的解决方法。

上面内容参考:https://blog.csdn.net/weixin_44826203/article/details/107484634

5. 参考

【1】https://blog.csdn.net/weixin_44826203/article/details/107484634
【2】https://blog.csdn.net/jasonjarvan/article/details/79955664
【3】https://blog.csdn.net/zzulp/article/details/77150129
【4】https://blog.csdn.net/qq_41595507/article/details/104123975
【5】https://github.com/baidu/lac

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

定义全局变量property与getprop

authordaisy.skye的博客_CSDN博客-Qt,嵌入式,Linux领域博主 adb调试 adb shell getprop .adb logcat 报错 init: sys_prop: permission denied uid:1006 name:ro.camera.gc02m1 在linux驱动中查找 find ./ -name *.c | xargs grep -n "property_set" find ./ -n…

《2023金融科技·校园招聘白皮书》新鲜出炉|牛客独家

数智创新时代,科技人才为先。 眼下,在建设“数字中国”的时代背景下,金融行业全面数智化转型已箭在弦上。政策端,金融行业为中共中央、国务院印发《数字中国建设整体布局规划》的7大重点行业之一。 资本端,仅2022年三…

【C++ 四】函数、指针

函数、指针 文章目录 函数、指针前言1 函数1.1 概述1.2 函数定义1.3 函数调用1.4 值传递1.5 函数常见样式1.6 函数声明1.7 函数分文件编写 2 指针2.1 指针基本概念2.2 指针变量定义和使用2.3 指针所占内存空间2.4 空指针和野指针2.5 const 修饰指针2.6 指针和数组2.7 指针和函数…

Cross compiling Windows binaries from Linux

IntroductionWhy? SpeedCostContainers k8sRejected Strategies Using x86_64-pc-windows-gnuUsing wine to run the MSVC toolchainHow? Prerequisites1. Setup toolchain(s)2. Acquire Rust std lib3. Acquire CRT and Windows 10 SDK4. Override cc defaults5. ProfitBon…

机器学习 探索性数据分析

文章目录1. 数据总览1.1 查看数据的维度1.2 查看列的数据类型1.3 查看索引1.4 获取数据值1.5 数据集相关信息概览1.6 查看数据的统计信息1.7 查看前3行数据2. 缺失值查看与处理2.1 缺失值查看2.2 缺失值处理3. 异常值检测与处理3.1 异常值检测3.2 异常值处理4. 特征分析4.1 查看…

计算机网络考试复习——第4章 4.6

理想的路由算法:几个特点 1.算法必须是正确和完善的 2.算法在计算上应该简单 3.算法能适应通信量和网络拓扑的变化具有自适应性也称为稳健性 4.算法应该具有稳定性 5。算法应该是公平的 6.算法应该是最佳的 关于“最佳路由”——不存在一种绝对的最佳路由算法…

第二章 法的内容与形式

目录 第一节 法的内容与形式的概念 一、法的内容与形式的含义 二、法的内容和形式的关系 第二节 法律权利与法律义务 一、权利和义务的概念 二、权利和义务的分类 三、权利与义务的联系 第三节 法的成文形式与不成文形式 一、历史上各种法的表现形式 二、成文法与不成文…

defaultdict 默认值

文章目录 前言语法setdefault()和defaultdict()的区别setdefault()defaultdict() 前言 在字典中查找某一个值的时候,若key不存在就会返回一个keyerror错误而不是一个默认值,如果想要返回一个默认值可以使用defaultdict函数。 defaultdict是python内建dic…

从0搭建Vue3组件库(三): 组件库的环境配置

本篇文章将在项目中引入 typescript,以及手动搭建一个用于测试组件库组件 Vue3 项目 因为我们是使用 ViteTs 开发的是 Vue3 组件库,所以我们需要安装 typescript、vue3,同时项目将采用 Less 进行组件库样式的管理 pnpm add vuenext typescript less -D -w 使用pnpm如果要安装在…

【C语言】void 和 void* 类型

一. void 类型 1. 为何不能定义 void 类型的变量 为什么不能定义 void 类型的变量?因为它是空类型,不能够为变量提供空间吗? 定义变量的本质是开辟空间,我们用 sizeof 来计算 void 类型的大小: 在vs2017下&#xf…

Direct3D 12——模板——平面阴影效果

平行光阴影 图展示了由平行光源经物体所投射岀的阴影。给定方向为L的平行光源,并用r(t)p tL来表 示途经顶点p的光线。光线r (t)与阴影平面(n,d)的交点为S。以此光源射出的光线照射到物体的各个顶点&#x…

Stable Diffusion本地搭建windows and linux(附搭建环境)

linux搭建过程以centos为例 1.使用git工具下载项目文件到本地文件夹,命令如下: git clone https://github.com/IDEA-CCNL/stable-diffusion-webui.git然后进入该文件夹: cd stable-diffusion-webui2.运行自动化脚本 运行webui.sh安装一些p…

2023最新接口自动化测试面试真题详解,看完轻松拿捏HR

目录 一.有接口测试工具为什么还需要开发自动化框架或自动化平台。 二.接口自动化中如果一个接口请求不通该如何排查 三.你平常做接口自动化的过程中发现过哪些bug?多吗? 四.你在接口自动化中是怎么校验接口返回结果是否正确? 五、接口自动化回归过程中…

【C生万物】 操作符篇

欢迎来到 Claffic 的博客 💞💞💞 前言: 我觉得学习语言,最直接的就是懂不懂符号,而符号中最突出的就是操作符,这期带大家认识认识C语言中的操作符及其使用。 目录 Part1:算数操作符 Part2:移…

直方图均衡化(调节图像亮度、对比度)

直方图均衡化(调节图像亮度、对比度) 本篇目录 🦄 一、前言 🦄 二、直方图均衡化概念 🦄 三、直方图均衡化实例 (1)、灰度图像的均衡处理实例 ①、卡通人物灰度图像均衡处理 ②、卡通猫头…

音频编辑开发SDK Audio DJ Studio for .NET Crack

11.7版本--Audio DJ Studio for .NET是 MultiMedia Soft 开发的 .NET Windows Forms 自定义控件,可以轻松地向使用Microsoft Visual Studio编写的Winform和WPF 应用程序添加声音播放和混音功能;由于与 DirectShow 编解码器和 BASS 库的集成,两…

【UITableView和UITableViewCell的常见属性 Objective-C语言】

一、UITableView和UITableViewCell的常见属性, 1.我们说,这些属性里面, 2.这些是不是都是单元格的属性, 1)这个imageView:是单元格里面的图片框,是不是指的是这个啊, 2)这个textLabel:是指的这个标题上面这个Label吧, 3)这个detailTextLabel:是指的标题下面这…

安装tomcat8,配置服务启动脚本,部署jpress应用

1. 简述静态网页和动态网页的区别。 静态网站顾名思义就是不能动的网站,其中的内容一旦做好就固定了。而动态网站是一种网页编程技术,它可以使得浏览器和服务器可以交互,根据服务器的不同请求动态的生成网页内容。 3. 简述 Webl.0 和 Web2.…

基于STM32的倒车雷达系统设计

目录 前言 一、绪论 1.1 设计背景 1.2 设计内容 二、系统硬件设计 2.1 硬件系统框图 2.2 主控制电路 2.3 超声波电路 2.4 OLED显示电路 2.5 键盘输入电路 2.6 声光报警模块电路 三、系统软件设计 3.1 系统主程序设计 3.2 OLED显示程序设计 3.3 键盘设定程序设计…

设计模式-结构型模式之外观模式

4. 外观模式4.1. 模式定义外观模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式…