【先总结来讲我自己的理解,大家可以先看人机评论,再来看我的这个理解】
1、就是基于规则的方法是“人工自己编写的一套规则”来进行语言处理。 2、而这个基于机器学习的方法就是“用算法从大量的数据中自动学习”来进行语言处理。 3、然后呢,这个区别就很明显了吧。那我们再看下面的优缺点就会更能理解了,人工自己编写的,准确率会比较高吧,解释性就比较强,并且还不需要很多数据。但是你就需要自己去维护了吧?灵活性也就差了(需要手动维护);并且你规定了规则,只是对这些方面进行了规则指定,其他方面呢?(这是泛化能力弱)。相反的机器学习那就泛化能力会比较强了,它不是规定的,而是自己学习的,但是缺点就是需要大量的数据,并且通过这个自动学习,它的决策就有不确定性了,很难理解。
【人机语言】
基于规则的自然语言处理方法是通过人工编写一套规则来对语言进行处理。这些规则通常基于语言学的理论,定义了语言的各种结构和规则,例如语法、语义等。常见的任务包括词性标注、句法分析等。
基于机器学习的方法则是通过算法从大量的标注数据中自动学习语言的特征,并通过这些特征进行处理。常见的机器学习方法包括监督学习、无监督学习和深度学习等。
词的独热表示(One-Hot Encoding)是一种将词汇表中的每个词映射到一个唯一的向量表示的方法。通常情况下,独热编码会创建一个与词汇表大小相同的向量,词汇表中的每个词都有一个唯一的位置,在该位置为1,其余位置为0。这种表示方式本身并没有考虑到词的其他语言特征,如词性(Part of Speech, POS)或词义(Semantics)。
为了在独热表示中引入词性、词义等特征,可以通过以下几种方法进行扩展:
词性是描述一个词在句子中功能的特征(例如,名词、动词、形容词等)。我们可以在原有的独热编码基础上,将词性信息作为额外的特征进行编码。 常见的做法是使用多维向量,将每个词的词性作为一个附加特征进行编码。
假设有一个词汇表:["cat", "run", "big"],以及它们的词性标签:["Noun", "Verb", "Adjective"]我们可以将词性信息嵌入到原始的独热编码中。
现在,假设将词性添加到独热表示中,每个词可以有两个附加位置——一个表示词性标签。
例如,“cat”作为名词(Noun)可以表示为:[1, 0, 0, 1, 0, 0],其中前3个位置是词汇表的独热编码,后3个位置是表示“名词”的词性编码(如:[1, 0, 0]代表名词,其他标签类似)。
词义(也可以称作语义)描述了词的实际意义。为了将词义嵌入到独热表示中,可以采用以下几种方式:
可以使用像WordNet这样的工具来为每个词分配语义标签,进而将这些标签作为附加的特征编码到独热向量中。词义的扩展通常包括为每个词提供一个或多个同义词集(Synset)。
假设有词汇表:["cat", "run", "big"],其中“cat”可以有“宠物”和“动物”两个语义标签。我们可以通过附加语义标签来扩展原始独热向量。 对于“cat”的词性标签和语义标签,我们的表示可以变为:[1, 0, 0, 1, 0, 0, 1, 0],其中“1, 0, 0”是词汇表的独热编码,“1, 0, 0”是词性的独热编码(如名词),后两个位置可以表示语义标签(如动物类或宠物类的标识)。
另一个方法是使用预训练的词向量模型(如Word2Vec或GloVe)来表示词的语义。这些词向量基于上下文学习词语之间的语义关系,因此词义已经被隐式编码进了词向量中。虽然这种方法并不直接修改独热编码,但它在模型中引入了词义特征,并能够更好地捕捉到词汇之间的语义相似性。
如果我们将词“cat”通过Word2Vec转换为一个500维的向量(包含词义信息),那么每个词的表示就不仅仅是一个在词汇表中占位的“1”或“0”,而是一个包含了丰富语义信息的实数向量。虽然这并不是严格的“独热表示”,但它是对词义的一种有效编码。
一种常见的方法是将词汇信息、词性信息和词义信息结合在一个综合表示中。例如,先通过独热编码表示词汇信息,然后附加词性标签和语义信息。这可以通过拼接多个独热向量、标量或实数向量来完成。
对于“cat”这个词,假设我们使用以下方式:
[1, 0, 0]
(对应词汇表中的“cat”)
[1, 0, 0]
(名词)
[1, 0]
(宠物类)
最终综合表示可以是:[1, 0, 0, 1, 0, 0, 1, 0],即将词汇的独热编码、词性的独热编码以及语义标签拼接在一起。
这种方法结合了词汇、词性和语义的特征,提供了更加丰富的信息,使得模型在处理任务时能够考虑多方面的特征。
这种方法可以使得模型在处理文本时,不仅仅依赖于单纯的词汇信息,而是能够理解词语的功能和语义,从而提升模型的表现。
解答这个问题前,先讲一下什么叫奇异值?
A(其中A∗是矩阵A的共轭转置矩阵)的特征值的非负平方根。用数学符号表示,设矩阵A的奇异值为σ_1,σ_2,⋯,σ_r,那么它们满足
其中λ_i是矩阵
A的特征值。
其共轭转置矩阵(因为是实矩阵,所以共轭转置就是转置)
然后计算A∗A
接下来求这个矩阵的特征值,通过解特征方程
即
计算行列式
解得特征值λ1≈29.698,λ2≈0.302,那么对应的奇异值为σ1≈29.698≈5.45,σ2≈0.302≈0.55。
奇异值分解(Singular Value Decomposition, SVD)是一种线性代数中的矩阵分解技术,它将一个任意矩阵分解成三个矩阵的乘积,以便揭示矩阵的内在结构。特别在自然语言处理中,奇异值分解常用于降维、特征提取等任务,尤其是通过潜在语义分析(Latent Semantic Analysis, LSA)来捕捉词之间的潜在语义关系。
给定一个矩阵 A(大小为 m×n),SVD将其分解为三个矩阵的乘积:
在自然语言处理中,特别是在基于词频的表示方法(如词-文档矩阵或词-上下文矩阵)中,矩阵 A 的每一行通常代表一个词,每一列代表一个特征(如文档或上下文),矩阵的元素是词和特征之间的关系(如词频、共现次数等)。奇异值分解(SVD)可以将这个矩阵分解为三个部分,揭示出词语之间的潜在高阶关系。
假设我们有一个简单的词-文档矩阵 A,其中矩阵的元素表示某个词在某个文档中的出现频率。对该矩阵进行SVD分解后,得到三个矩阵 U、Σ和
。如果我们从中保留前几个较大的奇异值(对应最重要的语义特征),并且通过矩阵 U中的词向量进行比较,那么“狗”(dog)和“猫”(cat)这样的词将出现在相似的高维空间位置上。它们的语义相似性会反映在它们在低维空间中的接近度。
奇异值分解(SVD)是一种强大的工具,可以帮助我们在词汇表的表示中引入潜在的语义信息。通过降维和提取最重要的奇异值,我们可以有效地捕捉到词与词之间的高阶关系(如语义相似性),从而提升自然语言处理任务的效果。SVD不仅仅局限于词的频率表示,还可以帮助揭示词的潜在语义和上下文关系,广泛应用于文档分析、信息检索、语义分析等领域。
在计算困惑度(Perplexity, PPL)时,如果某一项条件概率为0,通常意味着该词的出现是不可能的(在训练数据中从未出现过该词或该词在当前上下文中没有对应的概率分布)。这种情况下会导致无法计算困惑度,因为对数计算中会涉及到对0取对数,结果为负无穷。
通常有两种常见的解决方法:
Kneser-Ney平滑、Good-Turing平滑等方法也可以用于更复杂的语言模型,它们通过对低频词或从未见过的词进行调整来平滑概率分布。 Kneser-Ney平滑:
Good-Turing平滑:
线性插值法会在不同阶层的n-gram模型中进行加权平均,通常权重是通过经验或优化得到的。 其中,
在给定公式中,P(wi | wi-1) 表示词wi在给定其前一个词wi-1的条件下的条件概率。如果某一项为0(即某个词wi从未在wi-1的上下文中出现过),我们可以通过平滑方法来处理:
其中:
通过这种方法,即使某个词的条件概率为0,我们也能够通过平滑来得到一个大于0的概率,避免对数计算中的负无穷错误。
这种处理方法会影响模型的计算结果,但它有助于避免零概率带来的问题,从而使得困惑度的计算更加稳定。
逆向最大匹配算法(Reverse Maximum Matching, RMM)是一种常见的中文分词方法,其基本思路是从句子的末尾开始,匹配最长的词语。对于给定的句子,它首先从句子的末尾开始,依次尝试匹配最长的词,直到匹配到一个合适的词为止,接着继续处理剩余的部分。
这时剩下的句子是:“研究生命的”。
剩下的部分是:“研究生命”。
剩下的是“研究”。
使用逆向最大匹配算法对“研究生命的起源”进行分词的结果是:
在中文分词中,子词切分算法(例如基于子词的模型如BPE或WordPiece)和正向最大匹配算法(Forward Maximum Matching, FMM)是两种常见的分词方法。它们有不同的优缺点,适用于不同的场景。
正向最大匹配算法是一种基于字典的分词方法,它从左到右逐步扫描句子,每次选择字典中匹配的最长词进行分词。其工作原理类似于贪心算法,即每次匹配最优的(最长的)词。
子词切分算法(如Byte Pair Encoding (BPE) 和 WordPiece)是一种基于统计的分词方法,它将单词切分为更小的子单元(子词)。这些子词在训练过程中会学习到频繁的字母组合(或字符组合),并据此建立一个词汇表。
常见的子词切分算法有:
序列标注(Sequence Labeling) 是一种常见的自然语言处理(NLP)任务,它的目标是为输入的序列中的每个元素(如词语或字符)赋予一个标签。常见的序列标注任务包括命名实体识别(NER)、词性标注(POS tagging)、语义角色标注(SRL)等。句法分析可以被看作是一个序列标注问题,尤其是在对句子进行短语结构分析(Phrase Structure Parsing)和依存句法分析(Dependency Parsing)时。
虽然序列标注方法通常用于识别每个单词的标签,但它也可以扩展并应用于句法分析任务,特别是在以下两种情况下:
短语结构分析的目标是为句子中的每个成分(词语或短语)分配一个适当的语法标签,并将这些标签组织成一个树结构。尽管短语结构分析通常采用上下文无关文法(CFG)和其他基于树的解析方法,序列标注方法仍然可以应用于这类任务,尤其是通过以下步骤:
1.1 序列标注在短语结构分析中的应用 可以使用序列标注来为每个单词或词组分配一个短语结构标签,例如“名词短语(NP)”、“动词短语(VP)”等。此时,序列标注不仅需要为每个词打上词性标签,还需要预测它所属的短语结构标签。 具体流程:
例如,对于句子“猫在桌子上睡觉”,序列标注的任务可以是为每个单词分配一个短语标签:
1.2 局限性与挑战 短语结构分析通常要求解析树的深度信息,而传统的序列标注方法主要用于处理平面结构(即一维的标签序列)。因此,虽然序列标注方法在某些情况下可以有效处理短语结构分析任务,但对于复杂的层级结构,可能需要结合更多上下文信息或者使用更复杂的解析方法(例如基于句法树的生成模型)。
在依存句法分析中,主要目标是确定句子中各个单词之间的依存关系。每个单词都与一个主词(或依赖词)连接,通过这种依赖关系建立一个树形结构。与短语结构分析不同,依存句法分析着重于单词之间的依存关系而不是短语层级。
依存句法分析可以被视为序列标注问题的扩展,其中每个单词不仅要被标注词性,还要预测它与其他单词之间的依存关系。一个常见的策略是通过**依存标签(dependency labels)**来标记每个词之间的关系。
具体流程:
例如,对于句子“猫在桌子上睡觉”,依存句法标注的任务可以是:
2.2 序列标注的优势与挑战
1. 短语结构分析:
2. 依存句法分析:
评价中文分词系统的质量通常使用精确度(Precision)、召回率(Recall)和F1值(F1-Score)这些常见的指标,这些评价方法有助于衡量分词系统的准确性和全面性。
中文分词系统中的评估其实跟机器学习中正负样本的评估差不多,大家可以理解理解。
假设我们有一个测试集,其中包含句子和对应的人工标注分词结果。我们将通过比较系统的分词结果和人工标注结果,计算出精确度、召回率和F1值。
from collections import Counter
def evaluate_segmentation(system_output, reference_output):
"""
评估中文分词系统的精确度、召回率和F1值。
:param system_output: 分词系统的输出结果(分词后的词列表)
:param reference_output: 参考标准答案(人工标注的词列表)
:return: 精确度、召回率和F1值
"""
# 统计系统分词结果和参考结果中的词
system_words = set(system_output)
reference_words = set(reference_output)
# 计算交集(即正确分词的数量)
correct_words = system_words.intersection(reference_words)
correct_count = len(correct_words)
# 计算精确度、召回率和F1值
precision = correct_count / len(system_words) if len(system_words) > 0 else 0
recall = correct_count / len(reference_words) if len(reference_words) > 0 else 0
f1_score = 2 * (precision * recall) / (precision + recall) if (precision + recall) > 0 else 0
return precision, recall, f1_score
# 示例数据(句子的分词结果)
system_output = ["我", "喜欢", "自然语言", "处理", "和", "机器", "学习"]
reference_output = ["我", "喜欢", "自然", "语言", "处理", "和", "机器", "学习"]
# 计算评价指标
precision, recall, f1_score = evaluate_segmentation(system_output, reference_output)
print(f"精确度: {precision:.4f}")
print(f"召回率: {recall:.4f}")
print(f"F1值: {f1_score:.4f}")