01_NLP基础之文本处理的基本方法

自然语言处理入门

自然语言处理(Natural Language Processing, 简称NLP)是计算机科学与语言学中关注于计算机与人类语言间转换的领域,主要目标是让机器能够理解和生成自然语言,这样人们可以通过语言与计算机进行更自然的互动。

对于自然语言来说,处理的数据主要就是人类的语言,例如:汉语、英语、法语等,该类型的数据不像我们前面接触过的结构化数据、或者图像数据可以很方便的进行数值化。

自然语言处理的主要任务:

  • 语音识别:将语音信号转化为文本

  • 文本分析:从文本中提取有意义的信息,包括情感分析、主题提取等

  • 机器翻译:自动将一种语言的文本翻译为另一种语言

  • 语法分析:分析句子的语法结构,识别句子中的各个成分(如主语、谓语、宾语等)

  • 命名实体识别(NER):识别文本中的重要实体,如人名、地点名、组织名等

  • 对话系统:使计算机能够与人类进行自然流畅的对话,如智能助手、聊天机器人等

  • 自动摘要:从大量文本中提取出最关键信息并生成简洁的摘要

文本预处理

文本预处理是指在NLP任务中,对原始文本数据进行清洗、转换、标准化等一系列处理的过程。这是NLP工作流中至关重要的第一步,旨在通过去除冗余和无关的部分,提高文本数据的质量和可用性,以便后续的机器学习模型或深度学习模型能够更高效地学习和推理。

文本预处理的作用
  • 增强文本表示
    • 向量化: 将文本转换为数值向量(如TF-IDF、词嵌入)。
    • 特征提取: 提取n-gram、词性、句法结构等特征。
    • 上下文建模: 通过预处理为上下文相关的模型(如BERT)提供输入。
  • 提高数据质量
    • 清洗文本:原始文本可能包含多余的噪声(如HTML标签、标点符号、拼写错误等)。这些内容对NLP模型没有实际意义,反而可能会影响模型的学习效果。文本清洗可以去除这些无关的部分。
    • 标准化文本格式:例如统一大小写、统一数字的表示等,有助于减少模型的复杂度,让模型能够聚焦于重要信息。
  • 降低计算复杂度
    • 分词: 将句子拆分为单词或子词单元,便于后续处理。
    • 去停用词:停用词在文本中频繁出现,但对模型的语义贡献较小。去除这些停用词可以有效减少文本的维度,降低计算复杂度。
    • 词形还原与词干提取:通过将不同形式的词汇(如复数、动词时态等)归一化为基础形式,减少了模型的词汇量,有助于提高模型的训练效率和准确性。
  • 改进模型性能
    • 降低维度: 通过去除冗余信息,减少特征空间的维度,提高计算效率。
    • 增强一致性: 统一文本表示(如大小写转换、标点符号处理),避免模型混淆。
    • 改善泛化能力: 通过标准化和归一化,使模型更容易捕捉文本中的关键特征。

文本预处理的基本方法

分词

分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。

  • 英文:单词之间是以空格作为自然分界符的
  • 中文:只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符。

中文分词示例

源数据:[只因你太美!]
分词结果:['只因','你','太美','!']
分词的作用
  • 作为预处理的第一步,将文本拆分成有意义的单元
  • 帮助机器理解句子的基本结构和含义
常用的分词工具
  1. Jieba分词工具

Jieba(“结巴”)是一个开源的Python中文分词组件,它支持精确模式全模式搜索引擎模式三种分词模式。

Jieba分词工具的基本使用方式:

​ 1.jieba.cut:将分词结果返回到一个生成器对象

​ 2.jieba.luct:将分词结果返回到返回一个列表对象

函数剖析:

​ 1.jieba.cut

将中文句子分割成独立的单词,
Parameter:
    - sentence: 要分割的字符串
    - cut_all: 模型类型, True表示使用全模型,False表示使用精确模式
    - HMM:是否使用隐马尔可夫模型

jieba.cut核心源码:

def cut(self, sentence, cut_all=False, HMM=True, use_paddle=False):
    sentence = strdecode(sentence)  # 统一解码为 Unicode
    re_han = re_han_default # 正则表达式,匹配连续的,'有意义'的词元
    re_skip = re_skip_default # 正则表达式,跳过空白或换行符
    # 选择分词算法
    if cut_all:
        cut_block = self.__cut_all  # 全切分
    elif HMM:
        cut_block = self.__cut_DAG  # 基于 DAG + HMM
    else:
        cut_block = self.__cut_DAG_NO_HMM  # 基于 DAG 无 HMM
    # 正则切分文本块
    blocks = re_han.split(sentence)  # 按正则表达式对 中文/非中文分割
    for blk in blocks: # 遍历列表,生成单词
            if not blk:
                continue
            if re_han.match(blk):
                for word in cut_block(blk):
                    yield word
            else:
                tmp = re_skip.split(blk)
                for x in tmp:
                    if re_skip.match(x):
                        yield x
                    elif not cut_all:
                        for xx in x:
                            yield xx
                    else:
                        yield x   

2.jieba.lcut的源码实现:其实就是将生成器对象强转为列表

def lcut(self, *args, **kwargs):
	return list(self.cut(*args, **kwargs))
  • 精准分词:按照人类的思维逻辑进行分词:比如英雄联盟是一个词

    精准分词的使用:jieba.cut/jieba.lcut,设置参数cut_all=False

def dm01():
    CONTENTS = "阳光彩虹小白马,滴滴答滴滴答!"
    # cut_all=False 精准分词
    # 返回一个可迭代对象
    obj = jieba.cut(sentence=CONTENTS, cut_all=False)

    # 返回的是一个生成器对象
    # print(obj)  # <generator object Tokenizer.cut at 0x00000294FFB2EF00>
    # print(f'是可迭代对象吗?{isinstance(obj, Iterable)}')
    # print(f'是迭代器吗?{isinstance(obj, Iterator)}')

    print(f'分词的结果:{list(obj)}')
    res = jieba.lcut(CONTENTS, cut_all=False)
    print(f'lcut方式得到的结果:{res}')
  • 全模式分词:将句子中所有可以成词的词语全部扫描出来
def dm02():
	CONTENTS = "阳光彩虹小白马,滴滴答滴滴答!"
    obj = jieba.cut(sentence=CONTENTS, cut_all=True)

    print(obj)
    words = jieba.lcut(CONTENTS, cut_all=True)
    print(f'全模式分词后的结果:{words}')
  • 搜索引擎模式分词:在精确模式基础上对长词镜像再次切分,提高召回率,适用于搜索引擎分词

    def dm03():
        CONTENTS = "阳光彩虹小白马,滴滴答滴滴答!"
        obj = jieba.cut_for_search(sentence=CONTENTS)
        print(obj)
        words = jieba.lcut_for_search(CONTENTS)
        print(f'搜索引擎模式分词后的结果:{words}')
    
  • 繁体中文分词:针对中国香港, 台湾地区的繁体文本进行分词。

def dm04():
    content = "煩惱即是菩提,我暫且不提"
    words = jieba.lcut(content)
    print('words--->', words)
  • 用户自定义词典分词
    • 词典格式:一般定义在 .txt 文件中
      • 定义的格式:word freq word_type
        • word:词语(必填)
        • freq: 词频(可选)
        • word_type:词性(可选)
以下为示例
    阳光 5 n
    小白马 6 nz
    滴滴答 2
def dm05():
	CONTENTS = "阳光彩虹小白马,滴滴答滴滴答!"
    jieba.load_userdict('./data/userdict.txt')
    words = jieba.lcut(CONTENTS)
    print('words--->', words)

命名实体识别

命名实体识别(NER)是自然语言处理中的一个任务,旨在从文本中识别出特定类别的实体(如人名、地名、机构名、日期、时间等)。NER是信息抽取的一部分,帮助计算机识别出与任务相关的实体信息。

例如:

鲁迅, 浙江绍兴人, 五四新文化运动的重要参与者, 代表作朝花夕拾.

==>

鲁迅(人名) / 浙江绍兴(地名)人 / 五四新文化运动(专有名词) / 重要参与者 / 代表作 / 朝花夕拾(专有名词)
  • 作用
    • 信息抽取:NER帮助从海量的文本中自动抽取出结构化的实体信息,为数据分析、问答系统等提供有价值的内容。
    • 问答系统:在智能问答系统中,NER能够帮助系统准确理解用户的提问,并提取相关的实体信息以便生成更准确的回答。
    • 文本理解:NER对于文本理解至关重要,它帮助系统识别出文本中的关键信息,例如人物、地点、组织等,进而为语义分析和事件抽取提供支持。
  • 处理工具
    • SpaCyNLTKStanford NERBERT(通过微调)LTPHanLP等都可以用于命名实体识别任务。

词性标注

词性标注(Part-Of-Speech tagging, 简称POS)就是为文本中的每个词分配一个语法类别(即词性),例如名词、动词、形容词等。词性标注能够帮助模型理解词汇在句子中的语法功能,并为进一步的句法分析和语义分析提供支持。

  • 类型

    • 名词n:表示人、事物、地方等,例如 "中国", "鲁迅"
    • 动词v:表示动作、存在等,例如 "跑", "吃"
    • 形容词a:描述事物的性质或状态,例如 "大", "美丽"
    • 副词d:修饰动词、形容词或其他副词,例如 "马上", "非常"
    • 代词r:代替名词的词,例如 "我", "他们"
  • 作用

    • 理解句子结构:通过词性标注,可以知道每个词在句子中的角色,帮助理解句子的语法结构。
    • 支持其他NLP任务:许多高级任务如命名实体识别(NER)、句法分析、情感分析等,通常依赖于词性标注的结果。
    • 歧义消解:词性标注有助于解决同一单词在不同上下文中可能具有不同词性的情况。例如,单词 “lead” 可能是动词(引导)也可能是名词(铅),通过词性标注可以解决这种歧义。
  • 处理工具

    • JiebaNLTKSpaCyStanford POS Tagger等是常用的词性标注工具。
  • 使用Jieba分词完成POS任务[知道]

import jieba.posseg as pseg

CONTENT = '我见过很多天才,但他们都叫我天才'

def dm_pos():
    words = pseg.lcut(CONTENT)
    print('words->', words)
    name_entities = list()
    for word, flag in words:
        # r: 代词, v:动词,n:名词, ns: 地名
        if flag in ['r', 'v', 'n', 'ns',]:
            name_entities.append((word, flag))
    print('name_entities->', name_entities)
    return name_entities

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

思维链 Chain-of-Thought Prompting

论文: Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (Wei et al., 2022) 核心贡献: 首次提出通过显式的中间推理步骤&#xff08;即思维链&#xff09;提升大语言模型的复杂推理能力。该方法通过示例展示多步推理过程&#xff0c;引导模型生成逻辑…

计算机毕业设计SpringBoot+Vue.js体育馆管理系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

MySQL笔记---Ubuntu环境下从零开始的MySQL

1. 安装MySQL 1.1 自动安装&#xff08;固定版本&#xff09; 更新软件包列表&#xff1a;在终端中执行以下命令&#xff0c;以更新系统的软件包列表&#xff1a; sudo apt update安装MySQL服务器&#xff1a;运行以下命令安装MySQL服务器&#xff1a; sudo apt install mysql…

【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL

SQL备忘录 from to : 点击访问源地址

简易的微信聊天网页版【项目测试报告】

文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件&#xff08;Utils.py&#xff09;登录页面代码文件&#xff08;WeChatLogin.py&#xff09;好…

FinRobot:一个使用大型语言模型进行金融分析的开源AI代理平台

文章目录 前言一、生态系统1. 金融AI代理&#xff08;Financial AI Agents&#xff09;2. 金融大型语言模型&#xff08;Financial LLMs&#xff09;3. LLMOps4. 数据操作&#xff08;DataOps&#xff09;5. 多源LLM基础模型&#xff08;Multi-Source LLM Foundation Models&am…

【软考-架构】1.3、磁盘-输入输出技术-总线

GitHub地址&#xff1a;https://github.com/tyronczt/system_architect ✨资料&文章更新✨ 文章目录 存储系统&#x1f4af;考试真题输入输出技术&#x1f4af;考试真题第一题第二题 存储系统 寻道时间是指磁头移动到磁道所需的时间&#xff1b; 等待时间为等待读写的扇区…

USRP4120-通用软件无线电平台

1、产品描述 USRP4120平台是彬鸿科技公司推出的以XILINX XC7Z020 SOC处理器为核心&#xff0c;搭配ADI AD9361射频集成芯片&#xff0c;针对无线通信系统科研与教学实验场景的一款通用软件无线电平台。产品频率范围70MHz~6GHz&#xff0c;模拟带宽200KHz~56MHz&#xff0c;支持…

MAVEN的安装和配置指南【超详细】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装Maven1.下载适合自己的版本2.配置环境变量3.验证环境变量是否配置成功 二、MAVEN的配置1.配置本地仓库2.配置镜像仓库3.创建一个简单的Maven项目 总结 …

数据结构:二叉搜索树(排序树)

1.二叉搜索树的定义 二叉搜索树要么是空树&#xff0c;要么是满足以下特性的树 &#xff08;1&#xff09;左子树不为空&#xff0c;那么左子树左右节点的值都小于根节点的值 &#xff08;2&#xff09;右子树不为空&#xff0c;那么右子树左右节点的值都大于根节点的值 &#…

Observability:使用 Elastic Agent 跟踪你的 Steam Deck 游戏

作者&#xff1a;来自 Elastic AndersonQ 让我们以不同的方式看待可观察性&#xff0c;并使用我们最喜欢的工具来监控我们的游戏性能。今天&#xff0c;我们将探讨如何使用 Elastic Agent 来监控 Steam Deck&#xff0c;以便我们可以看到我们玩得最多的游戏、它们消耗了多少资源…

20250227解决飞凌OK3588-C的linux R4通过adb拷贝文件速度过慢的问题

20250227解决飞凌OK3588-C的linux R4通过adb拷贝文件速度过慢的问题 2025/2/27 16:51 缘起&#xff1a;最近测试OK3588-C的最新的R1版本的SDK&#xff0c;adb pull的速度为28.8 MB/s Z:\version\OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1 我司使用4线的USB2.0&#xff0c;…

cesium+vue3自定义HTML实体弹窗、加高德路网、防实体漂浮、让用户画圆、鹰眼

一、基础使用&#xff1a;Cesium.js基础使用&#xff08;vue&#xff09;-CSDN博客 1、基础路径 为 Cesium 库设置一个全局变量 CESIUM_BASE_URL&#xff0c;用于指定 Cesium 的资源文件&#xff08;如 WebGL shaders、纹理、字体等&#xff09;的 示例场景&#xff1a;假设你…

C# Unity 唐老狮 No.4 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

Docker 学习(二)——基于Registry、Harbor搭建私有仓库

Docker仓库是集中存储和管理Docker镜像的平台&#xff0c;支持镜像的上传、下载、版本管理等功能。 一、Docker仓库分类 1.公有仓库 Docker Hub&#xff1a;官方默认公共仓库&#xff0c;提供超过10万镜像&#xff0c;支持用户上传和管理镜像。 第三方平台&#xff1a;如阿里…

Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)

在 Oracle 数据库的学习进程中&#xff0c;分组查询与联表查询是进阶阶段的重要知识点&#xff0c;它们如同数据库操作的魔法棒&#xff0c;能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言&#xff0c;掌握这些技能不仅有助于高效地处理数据库数据&#xff0…

Lua | 每日一练 (4)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…

我代表中国受邀在亚马逊云科技全球云计算大会re:Invent中技术演讲

大家好我是小李哥&#xff0c;本名叫李少奕&#xff0c;目前在一家金融行业公司担任首席云计算工程师。去年5月很荣幸在全球千万名开发者中被选为了全球亚马逊云科技认证技术专家&#xff08;AWS Hero&#xff09;&#xff0c;是近10年来大陆地区仅有的第9名大陆专家。同时作为…

C++蓝桥杯基础篇(七)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们来一起学习蓝桥杯基础篇&#xff08;七&#xff09;&#xff0c;学习相关字符串的知识&#xff0c;准备好了吗&#xff1f;咱们开始咯&#xff01; 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…

显式 GC 的使用:留与去,如何选择?

目录 一、什么是显式 GC&#xff1f; &#xff08;一&#xff09; 垃圾回收的基本原理 &#xff08;二&#xff09;显式 GC 方法和行为 1. System.gc() 方法 2. 显式 GC 的行为 &#xff08;三&#xff09;显式 GC 的使用场景与风险 1. JVM 如何处理显式 GC 2. 显式 GC…