6月19日复盘

6月19日复盘

二、分词与词向量

分词和词向量是NLP的基础技术。

1. 分词

分词是将连续的文本分割成独立的词汇单元(tokens)的过程。这些单元可以是单词、符号或子词。

1.1 中文特性

中文句子由连续的汉字组成,没有明显的词边界:词与词之间没有分隔符

  • 英文:I love natural language processing.
  • 中文:我喜欢自然语言处理。
  • 词是最基本的语义单元。

为了处理文本信息,须将连续的序列分割成有意义的词汇单元。

1.2 概念认知

大家进行下颗粒度对齐,以保证后续沟通的准确性。

1.2.1 词表

词表,vocab,是指一个NLP系统中所有可能出现的词汇的集合。它是一个有限的列表,包含了模型任务中用到的所有词汇。

1.2.1.1 特征

词表具备以下特征:

  • 有限性:词表的大小是有限的,通常由训练数据中的词汇决定。
  • 覆盖性:词表应尽可能覆盖任务中可能出现的词汇。
  • 索引化:每个词分配一个唯一的索引(ID),用于在模型中表示该词。
1.2.1.2 作用
  • 词表是词向量表示的基础。
  • 词表用于将词汇映射为索引,进而转换为词向量。
1.2.1.3 构建

词表通常从大规模语料库中构建,包含所有高频和常见词,并可能经过一定的去除低频词的处理。

1.2.2 未登录词

Out-of-Vocabulary, OOV。

1.2.2.1 定义

未登录词是指在测试数据或实际应用中出现,但未包含在训练词表中的词汇。这些词汇对模型来说是未知的。

1.2.2.2 产生原因
  1. 词表大小限制:词表大小有限,低频词可能被忽略。
  2. 新词:新出现词汇(如网络用语、专有名词)可能未包含在训练数据中。
  3. 数据差异:训练数据和测试数据来自不同领域或时间。
1.2.2.3 处理方式
  1. 特殊符号表示:用特殊符号(如)表示所有未登录词。
  2. 子词分割:使用子词分割方法(如Byte Pair Encoding, BPE)将未登录词分解为已知的子词。
  3. 动态扩展词表:在测试或应用时动态扩展词表,将未登录词加入词表。
1.2.3 词频和词频概率

词频 ≠ 词频概率,但两者密切相关。

1.2.3.1 词频

词频,Frequency,指的是一个词在语料库中出现的次数,例如:

  • "研究" 出现了5000 次
  • "生命" 出现了3000 次

词频是一个整数,代表出现次数。

1.2.3.2 词频概率

词频概率,Word Probability, 是基于词频计算的相对概率,即:
P ( w ) = 词 w 的出现次数 所有词的总出现次数 P(w) = \frac{\text{词 w 的出现次数}}{\text{所有词的总出现次数}} P(w)=所有词的总出现次数 w 的出现次数
例如:

假设所有词的总出现次数是1000万次,那么:
P ( " 研究 " ) = 5000 10000000 = 0.0005 P ( " 生命 " ) = 3000 10000000 = 0.0003 P("研究") = \frac{5000}{10000000} = 0.0005 \\ P("生命") = \frac{3000}{10000000} = 0.0003 P("研究")=100000005000=0.0005P("生命")=100000003000=0.0003

1.2.3.3 二者对比

如果直接用词频数值(如5000、3000)来计算联合概率,会遇到尺度不统一的问题,导致一些高频词被过度偏好。

  • 词频是一个整数,不能直接用于概率计算。
  • 归一化:把词频转换成概率,使得所有词的概率和为1。

所以,更多的我们使用词频概率作为分词的参考值。

1.2.4 TF-IDF

Term Frequency-Inverse Document Frequency,TF-IDF,词频-逆文档频率。

词频-逆文档频率是一种常用的文本特征提取方法,用于衡量单词在文档中的重要性,特别适用于关键词提取、搜索引擎排名、文本分类等任务。

1.2.4.1 TF

词频,Term Frequency,TF,表示一个词在文档中出现的频率,公式:
TF ( t , d ) = 词  t  在文档  d  中出现的次数 文档  d  中所有词的总数 \text{TF}(t, d) = \frac{\text{词 } t \text{ 在文档 } d \text{ 中出现的次数}}{\text{文档 } d \text{ 中所有词的总数}} TF(t,d)=文档 d 中所有词的总数 t 在文档 d 中出现的次数

  • 作用:衡量一个词在文档中的重要性。词频越高,说明该词在文档中越重要。
  • 局限性:某些停用词(如的、是、得、地)在文档中频繁出现,但并没有实际意义,单靠TF无法准确衡量词的重要性。
1.2.4.2 IDF

逆文档频率,Inverse Document Frequency,用于衡量一个词在整个语料库中的普遍重要性,公式:
IDF ( t , D ) = log ⁡ ( 语料库中文档总数 包含词  t  的文档数 + 1 ) \text{IDF}(t, D) = \log \left( \frac{\text{语料库中文档总数}}{\text{包含词 } t \text{ 的文档数} + 1} \right) IDF(t,D)=log(包含词 t 的文档数+1语料库中文档总数)

  • 作用:如果一个词在大多数文档中都出现(如停用词),它的IDF值会很低;
  • 意义:降低常见词权重,提升稀有词权重。
1.2.4.3 TF-IDF

TF-IDF是TF和IDF的乘积,公式:
TF-IDF ( t , d , D ) = TF ( t , d ) × IDF ( t , D ) \text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D) TF-IDF(t,d,D)=TF(t,d)×IDF(t,D)

  • 意义:TF-IDF 值越高,说明该词在当前文档中越重要,同时在整个语料库中越稀有。
1.2.4.4 TF-IDF应用
  • 关键词提取:通过计算每个词的 TF-IDF 值,可以提取文档中最重要的关键词。
  • 文本相似度计算:将文档表示为 TF-IDF 向量后,可以通过计算向量之间的余弦相似度来衡量文档的相似性。
  • 文本分类:TF-IDF 可以作为特征输入到机器学习模型中,用于文本分类任务。
  • 搜索引擎:搜索引擎利用 TF-IDF 计算文档的相关性,排序搜索结果
  • 自动摘要:选取高 TF-IDF 词构成摘要
1.2.4.5 案例助解

语料库:

文档1:我爱自然语言处理
文档2:自然语言处理很有趣
文档3:我爱编程

计算词“自然语言”在文档1中的 TF-IDF 值:

  1. 计算 TF

    • 自然语言在文档 1 1 1 中出现了 1 1 1 次。
    • 文档 1 1 1总词数为 4 4 4 我、爱、自然语言、处理
    • TF = 1 4 = 0.25 \text{TF} = \frac{1}{4} = 0.25 TF=41=0.25
  2. 计算 IDF

    • 语料库中文档总数为 3 3 3
    • 包含自然语言的文档数为 2 2 2 文档1和文档2
    • IDF = log ⁡ ( 3 2 + 1 ) = log ⁡ ( 1 ) = 0 \text{IDF} = \log \left( \frac{3}{2 + 1} \right) = \log(1) = 0 IDF=log(2+13)=log(1)=0
  3. 计算TF-IDF

    • TF-IDF = 0.2 × 0 = 0 \text{TF-IDF} = 0.2 \times 0 = 0 TF-IDF=0.2×0=0
1.2.4.6 TF-IDF优缺点
  • 优点:

    • 简单有效,易于理解和实现。

    • 能够突出文档中的关键词。

    • 适用于大多数文本挖掘任务。

  • 缺点:

    • 无法捕捉词与词之间的关系(如语义信息)。

    • 对短文本效果较差。

    • 无法处理一词多义和多词一义的问题。

1.2.4.7 TF-IDF实现

可以使用 sklearn 库计算 TF-IDF:

import jieba
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
# 示例文档
documents = ["我爱自然语言处理", "自然语言处理很有趣", "我爱编程"]
# 自定义全模式分词函数
jieba.add_word("我爱")
def jieba_tokenizer(text):
    return " ".join(jieba.cut(text))

# 使用全模式进行分词
tokenized_documents = [jieba_tokenizer(doc) for doc in documents]
# 初始化 TF-IDF 向量化器
vectorizer = TfidfVectorizer()
# 计算 TF-IDF 值
tfidf_matrix = vectorizer.fit_transform(tokenized_documents)
# 获取词汇表
feature_names = vectorizer.get_feature_names_out()
# 打印 TF-IDF 结果
df = pd.DataFrame(tfidf_matrix.toarray(), columns=feature_names)
print(df)

输出:

        处理      我爱       有趣       编程   自然语言
0  0.577350  0.577350  0.000000  0.000000  0.577350
1  0.517856  0.000000  0.680919  0.000000  0.517856
2  0.000000  0.605349  0.000000  0.795961  0.000000
1.2.5 有向无环图

Directed Acyclic Graph,DAG

1.2.5.1 DAG认知

有向无环图是图论中的一种数据结构,由顶点Vertices和边Edges组成,其中:

  • 每条边都有明确的方向;
  • 整个图是无环的,即图中不存在从一个顶点出发,经过一系列边后又回到该顶点的路径。
1.2.5.2 DAG与分词

6月19日复盘_第1张图片

  • 有向:Directed,边有方向,比如从 起始字符可能的下一个词
  • 无环:Acyclic,不会形成环,保证分词时不会无限循环。
  • 句子中的字符作为顶点Vertices,可能的分词作为边Edges。
  • 找到所有可能的分词路径,形成一个“分词图”
1.2.5.3 案例助解

假设字典中包含:"研究" "研究生" "生命" "生" "命" "起源"

import jieba
text = "研究生命起源"
dag = jieba.get_DAG(text)  # 获取 DAG
print(dag)

示例输出

{0: [0, 1, 2], 1: [1], 2: [2, 3], 3: [3], 4: [4, 5], 5: [5]}

文本:"研究生命起源"

索引:  0   1   2   3   4   5
字符:  研  究  生   命  起   源

具体解释

0: [0, 1, 2]

  • 索引 0 处的 "研" 可以是一个单独的词 → 0 → 0 ("研")
  • 索引 01 形成 "研究"0 → 1 ("研究")
  • 索引 02 形成 "研究生"0 → 2 ("研究生")

1: [1]

  • 索引 1 处的 "究" 只能单独成词 → 1 → 1 ("究")

2: [2, 3]

  • 索引 2 处的 "生" 可以是一个单独的词 → 2 → 2 ("生")
  • 索引 23 形成 "生命"2 → 3 ("生命")

3: [3]

  • 索引 3 处的 "命" 只能单独成词 → 3 → 3 ("命")

4: [4, 5]

  • 索引 4 处的 "起" 可以是一个单独的词 → 4 → 4 ("起")
  • 索引 45 形成 "起源"4 → 5 ("起源")

5: [5]

  • 索引 5 处的 "源" 只能单独成词 → 5 → 5 ("源")

可视化 DAG

从 DAG 的角度看,可以画出一张图:

  研 → 究 → 生 → 命 → 起 → 源
  |    |    |    |    |    |
  v    v    v    v    v    v
  研   究    生   命   起   源  (单字成词)
  |____|
  研究
  |________|
  研究生
       |____|
       生命
            |____|
            起源
  • 单个字可以独立成词
  • 部分字符组合可以形成更长的词

**路径示例:**可能的分词方案

  1. ["研究生", "命", "起源"]
  2. ["研究", "生命", "起源"]
  3. ["研", "究", "生命", "起源"]

1.3 分词挑战

分词非常重要,但中文分词面临一些独特的挑战:

1.3.1 歧义问题

中文中存在大量歧义切分问题。例如:

“结婚的和尚未结婚的”可以切分为:
- 结婚///尚未/结婚/- 结婚//和尚//结婚/
1.3.2 未登录词问题

未登录词(Out-of-Vocabulary, OOV)是指未出现在分词词典中的词汇,如新词、专有名词、网络用语等。

解决思路:

  • 复杂机构名通常由命名实体识别来完成。
  • 新词通常由专门的新词发现工作负责。
  • 专业领域的术语通常由信息抽取工作负责。
  • 数词、时间词、词语的变形组合可以通过制定语法规则进行的处理。
1.3.3 标准不统一

中文分词的标准尚未完全统一,不同任务可能需要不同的分词粒度。例如:

“自然语言处理”可以切分为:
- 细粒度:自然/语言/处理
- 粗粒度:自然语言/处理

1.4 分词方法

分词的方法比较多,我们这里认知一下。

1.4.1 基于规则的分词

采用人工设定的词典和规则进行匹配,如正向最大匹配法(FMM)、逆向最大匹配(RMM)、双向最大匹配(BMM)。

ForwardMaxMatch

6月19日复盘_第2张图片

最大匹配法基本步骤如下:

  1. 从文本中选取长度为 6 − 8 6-8 68 个汉字的字符串作为最大字符串。
  2. 将其与词表匹配:
    • 若匹配成功,则作为一个词切分;
    • 若失败,则去掉末尾一个汉字,继续匹配,直到成功或字符串为空。
  3. 重复上述过程,直到整个文本被切分完毕。

逆向最大匹配法则是从后往前匹配:

6月19日复盘_第3张图片

双向最大匹配法则是正向、逆向都做一次,选择结果比较好的那个

1.4.1.1 针对歧义问题

在减少歧义问题上,逆向最大匹配法是效果比较好的:

“他是研究生物化学的”的不同的匹配法结果:
- FMM:他//研究生/物化//- RMM:他//研究/生物/化学/

RMM更符合汉语的语义结构,因为汉语中心词多在词的右面。

在词典完备、没有任何其它知识的条件下,实验对比如下:

  • 正向最大匹配法:1/169
  • 逆向最大匹配法:1/245
1.4.1.2 OOV问题

逆向最大匹配法在处理未登录词时表现更好,因为它更倾向于将未登录词切分为已知的右侧词汇。

1.4.2 基于统计的分词

采用统计模型对文本进行分词,如隐马尔可夫模型(HMM)、最大熵模型(ME)。

  • 优点:能适应不同领域,处理未登录词能力较强。
  • 缺点:依赖于大量的标注数据进行训练。
1.4.2.1 互信息认知

Mutual Information,MI

互信息衡量的是两个字符或子词同时出现的概率,可以理解为它们之间的“黏合度”:
M I ( x , y ) = log ⁡ 2 P ( x , y ) P ( x ) P ( y ) MI(x, y) = \log_2 \frac{P(x, y)}{P(x)P(y)} MI(x,y)=log2P(x)P(y)P(x,y)
其中:

  • P ( x , y ) P(x, y) P(x,y) 表示两个字连在一起出现的概率(联合概率)。
  • P ( x ) P(x) P(x) P ( y ) P(y) P(y) 分别表示单独出现的概率(边际概率)。
  • l o g 2 log_2 log2 让计算值更直观,通常以 2 2 2 为底。
1.4.2.2 互信息举例
人工智能正在改变世界。

如果统计出的概率如下:

  • P(人工) = 0.05 :单独出现人工的情况只有一个百分点
  • P(智能) = 0.04:单独出现 智能 的情况0
  • P(人工智能) = 0.04

那么:
M I ( 人工 , 智能 ) = log ⁡ 2 P ( 人工智能 ) P ( 人工 ) × P ( 智能 ) = log ⁡ 2 0.04 0.05 × 0.04 = log ⁡ 2 0.04 0.002 = log ⁡ 2 20 ≈ 4.32 MI(人工, 智能) = \log_2 \frac{P(人工智能)}{P(人工) \times P(智能)} \\ = \log_2 \frac{0.04}{0.05 \times 0.04} = \log_2 \frac{0.04}{0.002} = \log_2 20 \approx 4.32 MI(人工,智能)=log2P(人工)×P(智能)P(人工智能)=log20.05×0.040.04=log20.0020.04=log2204.32
M I MI MI 值较高(远大于 0),说明"人工智能"是一个 高关联短语 ,应被合并成一个词。

如果换成随机组合的字:

  • P(人工) = 0.05
  • P(出错) = 0.01
  • P(人工出错) = 0.0001

计算:
M I ( 人工 , 出错 ) = log ⁡ 2 0.0001 0.05 × 0.01 = log ⁡ 2 0.2 ≈ − 2.32 MI(人工, 出错) = \log_2 \frac{0.0001}{0.05 \times 0.01} = \log_2 0.2 \approx -2.32 MI(人工,出错)=log20.05×0.010.0001=log20.22.32
M I MI MI 值较小(接近0或为负),说明 “人工出错” 之间 没有太强的联系,不应分为一个词。

1.4.3 基于深度学习的分词

采用神经网络,如LSTM/GRU+CRF、BERT等预训练模型。

  • 优点:能够自动学习特征,适应性强。
  • 缺点:计算量大,对数据要求高。

你可能感兴趣的:(人工智能,transformer)