当前位置: 首页 > article >正文

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

http://www.kler.cn/a/573046.html

相关文章:

  • 【Kubernets】K8S内部nginx访问Service资源原理说明
  • 【C语言】宏定义中X-Micro的使用
  • MySQL 数据库连接池爆满问题排查与解决
  • STM32---FreeRTOS临界段与任务调度器
  • 华为od机试-缓存需要最少金币数 /静态扫描(java)
  • 【C++设计模式】第四篇:建造者模式(Builder)
  • 机器学习-决策树详细解释
  • 算法进阶——枚举
  • 构建智能 SQL 查询代理agent,把整个查询过程模块化,既能自动判断使用哪些表,又能自动生成 SQL 语句,最终返回查询结果
  • 敏捷开发之自动化流水线
  • Ubuntu ollama 指定 gpu devices
  • 【VS2019】 .Net Core 3.1 无法打开项目文件
  • MagicArticulate: Make Your 3D Models Articulation-Ready 论文解读
  • SSE 和 WebSocket 的对比
  • 如何在Spring Boot中读取JAR包内resources目录下文件
  • 【封闭式】论文写作技巧--集中学习+集中写作
  • 高并发应用分层架构
  • 【MySQL】索引|作用|底层数据结构|常见问题
  • unity6 打包webgl注意事项
  • sqli-lab靶场学习(七)——Less23-25(关键字被过滤、二次注入)