【NLP入门系列二】NLP分词和字典构建

🍨 本文为🔗365天深度学习训练营 中的学习记录博客
🍖 原作者:K同学啊
博主简介:努力学习的22级本科生一枚 🌟​;探索AI算法,C++,go语言的世界;在迷茫中寻找光芒​🌸
博客主页:羊小猪~~-优快云博客
内容简介:NLP入门二,分词基础知识和构建词典。
🌸箴言🌸:去寻找理想的“天空“”之城
上一篇内容:【NLP入门系列一】NLP概述和独热编码-优快云博客

文章目录
1、汉字分词
什么是词?
什么是分词?
为什么分词
分词规范
分词主要难点–切割歧义
如何排除切割歧义?
未登录词
主要分词方法
字典
2、构建字典
1、导入数据
2、设置分词器
3、清楚标点和停用词
4、设置迭代器
5、构建词典
6、文本展示
1、汉字分词
什么是词?
📖 词是自然语言中最小的有意义的构成单位

👁 汉语词的特点:

汉语的五级语法单位:

语素、词、短语、句子、句群
“结合紧密、使用频繁”

汉语的词可以拆开

“革命也好罢,”阿Q想,“革这伙妈妈的命,太可恶!太可恨!
有的词可以调换位置

理发-理了好几次发-发理了
有的词虽然结合紧密,但可以有限度地扩展

看见—>看得见,看不见
什么是分词?
📘 分词,把没有明显分界标志的字串切分为词串(字符串–>切割为字串)

🐾 步骤:

根据分词规范,建立机器词典

根据分词算法和机器词典,把字串切分为词串

🌩 示例1:

**原句:**十年春齐师伐我公将战曹刿请见其乡人曰肉食者谋之又何间焉刿曰肉食者鄙未能远谋
**切割后:**十年春,齐师伐我。公将战,曹刿请见。其乡人曰:“肉食者谋之,又何间焉。刿曰:“肉食者鄙,未能远谋。
❤️ 核心:

分词规范、机器词典,这两个概念接下来介绍。
为什么分词
一句话概括:就是更好的处理中文意思。

⛈ 如下:

📚 文本检索

和服 | 务 | 于三日后裁制完毕,并呈送将军府中。

王府饭店的设施 | 和 | 服务 | 是一流的。

如果不分词或者“和服务”分词有误,都会导致荒谬的检索结果。

📑 文语转换

他们是来 | 查 | 金泰 | 撞人那件事的。(“查”读音为cha)
行侠仗义的 | 查金泰 | 远近闻名。(“查”读音为zha)
分词规范
📚 中国国家标准GB13715 刘源等《信息处理用现代汉语分词规范及自动分词方法》

🥊 分词规范内容

二字或三字词,结合紧密、使用稳定。

发展 可爱 红旗
对不起 自行车 青霉素
四字成语一律为分词单位。

胸有成竹 欣欣向荣
五字和五字以上的谚语、格言等,分开后如不违背原有组合的意义,应予切分。

时间/就/是/生命/
失败/是/成功/之/母……
分词主要难点–切割歧义
中文博大精深,有时候一个字,在不同语境下都有不同的意思,故如何对一句话进行正确切分,且不能破坏原有的意思,是分词的主要难点。

交集型切分歧义

汉字串AJB被称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分别为汉字串)。此时汉字串J被称作交集串。

🌩 例:

交集型切分歧义,“结合成分子”
结合 | 成 分|子 |
结 | 合成 |分子|
结合|成|分子|
覆盖型切分歧义

汉字串AB被称作覆盖型切分歧义:

A、B、AB同时为词;
中文文本中至少存在一个前后语境C,在C的约束下,A、B在语法和语义上都成立。
💌​ 例,“美女”

美/女/运动员/涉嫌/服用/兴奋剂
美女/运动员/受/到/观众/的/喜爱
**满足:**在C的约束下,A、B在语法和语义上都成立。

1️⃣ **第一句:**美/女/运动员/涉嫌/服用/兴奋剂

句子重点在于“女性运动员”涉嫌违规,而非强调“美女”这一整体形象。
2️⃣ **第二句:**美女/运动员/受/到/观众/的/喜爱

句子强调“具有美女特质的运动员”受到观众喜爱,需将“美女”作为整体概念。
如何排除切割歧义?
利用前趋字串和后继字串在词法、句法、语义、语用方面的信息

1️⃣利用词法信息

如果交段与其后继字串组成名词,则将该歧义词首字单切,否则,确认该歧义词为词。

**例:**湖上有几只美丽的白天鹅

“白”(形容词) + “天鹅”(名词) → 形成名词短语(“白色的天鹅”),故将首字单切,即切分为“白/天鹅”。

2️⃣ 利用句法信息

如果歧义字段是量词且直接前趋字串是数词,那么歧义字段的首段单切,否则,该歧义字段成词.

**例:**一阵风吹过来了

当量词(“阵”)的前趋是数词(“一”)时,需将“一”与“阵”分开切分,即“一/阵”。

3️⃣ 利用语义信息

如果歧义切分字段后继动词的义项中含有动作发出者为“人”这个义素,则歧义字段的尾字单切,否则该歧义字段成词

**例:**学生会兴奋得手舞足蹈

学生/会/兴奋/得/手舞足蹈
4️⃣ 利用语用信息

这个是根据句子的用处。


未登录词
就是在词典中没有登录过的人名(中国人名和外国人译名)、地名、机构名、新词语、缩略语等。当采用匹配的方法来切词时,由于词典中没有登录这些词,会引起自动切词的困难。

主要分词方法
正向最大匹配法(Forward Maximum Matching method, FMM法)

选取包含6-8个汉字的符号串作为最大符号串,把最大符号串与词典中的单词条目相匹配
如果不能匹配,就削掉一个汉字继续匹配,直到在词典中找到相应的单词为止。
💠 匹配的方向是从右向左

逆向最大匹配法(Backward Maximum Matching method, BMM法)

匹配方向与MM法相反,是从左向右。

💠 实验表明:对于汉语来说,逆向最大匹配法比最大匹配法更有效。

双向匹配法(Bi-direction Matching method, BM法)

💠 比较MM法与RMM法的切分结果,从而决定正确的切分。

字典
在nlp中,字典 是一种将文本数据(如单词、字符或符号)映射到数值或向量形式的核心工具。

二、为什么要构建字典?

构建字典是NLP任务的基础步骤,他可以:

将文本数字化

机器无法直接处理文本:计算机只能处理数值,而文本是字符或符号的组合。

字典的作用:通过索引或向量将文本转换为数学形式,例如:

词汇表将“苹果”映射为索引 0。

嵌入字典将“苹果”映射为向量 [0.1, 0.2, 0.3]。

统一数据表示

标准化输入:确保所有文本数据按照统一规则转换,避免歧义。
处理未知词:通过 <UNK> 标记(未知词)处理训练时未出现的词汇。
2、构建字典
构造词典就是可以根据自己想要词,对数据进行分割,这个“字典”可以理解我们日常中那本“字典”。

1、导入数据
from torchtext.vocab import build_vocab_from_iterator # 词汇表构建
from collections import Counter  # 词频统计
from torchtext.data.utils import get_tokenizer   #  获取分词器
import jieba,re,torch  # 分词、正则表达式

data = [
    "我是K同学啊!",
    "我是一个深度学习博主,",
    "这是我的365天深度学习训练营教案",
    "你可以通过百度、微信搜索关键字【K同学啊】找到我"
]
AI写代码
python
运行

1
2
3
4
5
6
7
8
9
10
11
2、设置分词器
# 设置中文分层方法,设置精准切割
tokenizer = jieba.lcut
# 加载自定义词典, 让 jieba 在分词时能够识别并优先使用自定义词典中定义的词语
jieba.load_userdict("my_dict.txt")
AI写代码
python
运行
1
2
3
4
Building prefix dict from the default dictionary ...
Dumping model to file cache C:\Users\WY118C~1\AppData\Local\Temp\jieba.cache
Loading model cost 1.050 seconds.
Prefix dict has been built successfully.
AI写代码
1
2
3
4
3、清楚标点和停用词
# 在使用 jieba 进行分词时,可以通过去除标点符号来减少分词结果中的噪音
# 移除标点
def remove_punctuation(text):
    return re.sub(r'[^\w\s]', '', text)  # 用正则表达式

# 停用词(即没有具体含义、对文本语义没有影响的词汇,如“的”、“是”、“这”),减少分词结果中的噪音
# 设置停用词表
stopwords = set([
    "的", "这", "是" 
])

# 去除停用词函数
def remove_stopwords(text):
    return [word for word in text if word not in stopwords]
AI写代码
python
运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
4、设置迭代器
# 返回文本数据中词汇
def yield_tokens(data_iter):
    for text in data_iter:
        # 去标点
        text = remove_punctuation(text)
        # 分词
        text = tokenizer(text)
        # 去除停用词
        text = remove_stopwords(text)
        yield text  # 并行读取
AI写代码
python
运行

1
2
3
4
5
6
7
8
9
10
5、构建词典
# 使用build_vocab_from_iterator来构建词汇表
vocab = build_vocab_from_iterator(yield_tokens(data), specials=["<unk>"])

# 将未知的词汇索引为0, 词汇表中没有的
vocab.set_default_index(vocab["<unk>"])
AI写代码
python
运行
1
2
3
4
5
build_vocab_from_iterator 是 PyTorch 的 torchtext 库中用于构建文本词汇表(Vocabulary)的核心函数.

函数原型

from torchtext.vocab import build_vocab_from_iterator

vocab = build_vocab_from_iterator(
    iterator: Iterable,          # 分词后的文本生成器
    min_freq: int = 1,           # 最小词频阈值
    specials: Optional[List[str]] = None,  # 特殊标记
    special_first: bool = True,  # 是否将特殊标记放在最前面
    max_tokens: Optional[int] = None       # 词汇表最大容量
)
AI写代码
python
运行
1
2
3
4
5
6
7
8
9
参数详解

参数    作用    示例
iterator    必填参数。分词后的文本生成器,需返回列表(如 ["word1", "word2"])。    yield_tokens(data):逐条返回分词后的文本列表。
min_freq    可选参数。保留词频≥该值的词。默认 1(保留所有词)。    min_freq=2:过滤出现次数 <2 的词。
specials    可选参数。添加特殊标记(如 <unk> 表示未知词)。默认 None。    specials=["<unk>", "<pad>"]:添加未知词和填充标记。
special_first    可选参数。是否将 specials 放在词汇表最前面。默认 True。    special_first=False:特殊标记放在末尾。
max_tokens    可选参数。词汇表最大容量(含特殊标记)。默认 None(不限制)。    max_tokens=1000:最多保留 1000 个词(含特殊标记)。
注意事项

生成器函数要求:

必须返回分词后的列表(如 ["word1", "word2"]),而非字符串。
需提前完成分词、去标点、停用词过滤等预处理。
特殊标记 <unk>:

必须配合 set_default_index(vocab["<unk>"]) 使用,否则未知词会抛出 KeyError。
词频与截断:

min_freq 和 max_tokens 可组合使用,例如 min_freq=2 和 max_tokens=1000。
索引冲突:

若需 <pad>(填充标记)的索引为 1,需确保 specials 的顺序:

specials=["<unk>", "<pad>"]  # <unk>为0,<pad>为1
AI写代码
python
运行
1
6、文本展示
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/weixin_74085818/article/details/148639045

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值