NLP入门之中文分词

文章目录

分词是一个被长期研究的任务,通过了解分词算法的发展,可以看到NLP的研究历程,分词是NLP中一类问题的代表,分词很常用,很多NLP任务建立在分词之上。目前分词切分的难点主要有歧义切分、新词、专有名词、改造词等。

正向最大匹配

实现方式(一)------滑动窗口

1.找出词表中最大词长度

2.从字符串开头开始选取最大词长度的窗口,检查窗口内的词是否在词表中

3.如果在词表中,在词边界处进行切分,之后移动到词边界处,重复步骤2

4.如果不在词表中,窗口右边界回退一个字符,之后检查窗口词是否在词表中

python 复制代码
def cut_method1(string, word_dict, max_len):
    words = []
    while string != '':
        lens = min(max_len, len(string))
        word = string[:lens]
        while word not in word_dict:
            if len(word) == 1:
                break
            word = word[:len(word) - 1]
        words.append(word)
        string = string[len(word):]
    return words

实现方式(二)------前缀字典

1.从前向后进行查找

2.如果窗口内的词是一个词前缀则继续扩大窗口

3.如果窗口内的词不是一个词前缀,则记录已发现的词,并将窗口移动到词边界
如下字典:

{

"北": 0,

"北京": 1,

"北京大": 0,

"北京大学": 1,

"北京大学生": 1,

"大": 0,

"大学": 0,

"大学生": 1

}

0代表不是一个词,但是是词的前缀,1代表是一个词。其实和滑动窗口类似,一字一字看,如果这个字在字典中为0,则继续看下一个字,改字组合为1,还要继续看,直到组合不在字典中,就将上个组合字切分,并更新窗口。

python 复制代码
def cut_method2(string, prefix_dict):
    if string == "":
        return []
    words = []  # 准备用于放入切好的词
    start_index, end_index = 0, 1  #记录窗口的起始位置
    window = string[start_index:end_index] #从第一个字开始
    find_word = window  # 将第一个字先当做默认词
    while start_index < len(string):
        #窗口没有在词典里出现
        if window not in prefix_dict or end_index > len(string):
            words.append(find_word)  #记录找到的词
            start_index += len(find_word)  #更新起点的位置
            end_index = start_index + 1
            window = string[start_index:end_index]  #从新的位置开始一个字一个字向后找
            find_word = window
        #窗口是一个词
        elif prefix_dict[window] == 1:
            find_word = window  #查找到了一个词,还要在看有没有比他更长的词
            end_index += 1
            window = string[start_index:end_index]
        #窗口是一个前缀
        elif prefix_dict[window] == 0:
            end_index += 1
            window = string[start_index:end_index]
    #最后找到的window如果不在词典里,把单独的字加入切词结果
    if prefix_dict.get(window) != 1:
        words += list(window)
    else:
        words.append(window)
    return words

对比两种实现方式,滑动窗口更占用时间,前缀字典更占用内存。

反向最大匹配

反向最大匹配就是滑动窗口从后往前,方法与上两种类似。

北京大学生前来报到

正向匹配: 北京大学 / 生前 / 来 / 报到

反向匹配: 北京 / 大学生 / 前来 / 报到

不同的匹配方式在不同的例句中有不同的效果,有些使用正向匹配好,有些使用反向匹配好。

双向最大匹配

能不能结合正向匹配与反向匹配?

同时进行正向最大切分,和负向最大切分,之后比较两者结果,决定切分方式。

如何比较?

1.单字词

词表中可以有单字,从分词的角度,我们也会把它称为一个词

2.非字典词

未在词表中出现过的词,一般都会被分成单字

3.词总量

不同切分方法得到的词数可能不同

正向最大切分,负向最大切分,双向最大切分共同的缺点:

1.对词表极为依赖,如果没有词表,则无法进行;如果词表中缺少需要的词,结果也不会正确

2.切分过程中不会关注整个句子表达的意思,只会将句子看成一个个片段

3.如果文本中出现一定的错别字,会造成一连串影响

4.对于人名等的无法枚举实体词无法有效的处理

jieba分词

jieba第三方库会把一句话的所有可能的切分方式切出来,然后计算哪种切分方式总词频最高(词频事先根据分词后语料统计出来),就是哪种切分方式。

相关推荐
喵手8 分钟前
Python爬虫实战:构建各地统计局数据发布板块的自动化索引爬虫(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·采集数据csv导出·采集各地统计局数据发布数据·统计局数据采集
天天爱吃肉82181 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
m0_715575341 小时前
使用PyTorch构建你的第一个神经网络
jvm·数据库·python
甄心爱学习1 小时前
【leetcode】判断平衡二叉树
python·算法·leetcode
深蓝电商API1 小时前
滑块验证码破解思路与常见绕过方法
爬虫·python
Ulyanov1 小时前
Pymunk物理引擎深度解析:从入门到实战的2D物理模拟全攻略
python·游戏开发·pygame·物理引擎·pymunk
阿杰学AI1 小时前
AI核心知识91——大语言模型之 Transformer 架构(简洁且通俗易懂版)
人工智能·深度学习·ai·语言模型·自然语言处理·aigc·transformer
sensen_kiss1 小时前
INT303 Coursework1 爬取影视网站数据(如何爬虫网站数据)
爬虫·python·学习
玄同7652 小时前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
Yorlen_Zhang2 小时前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#