简要概述 n-gram 语言模型以及自选另一种语言模型

n-gram

N-gram语言模型是一种基于统计的自然语言处理模型。它的核心思想是利用前N-1个词的出现概率来预测第N个词的出现概率。其中,N表示N-gram模型的阶数,通常为1、2或3(即unigram、bigram、trigram),该模型的输出结果是一个单词序列的概率值。N-gram模型在语音识别、机器翻译、文本生成等领域中有着广泛的应用。

具体而言,N-gram模型需要先在大规模的语料库中统计相邻N个词出现的频次以及后续单词的概率分布。然后,当给定了前N-1个词时,该模型就可以推断出下一个词的可能性分布,从而生成一个句子。

N-gram模型的主要缺点是无法处理长距离依赖性,也无法处理词汇多义现象。另外,当N值较大时,需要统计的数据规模也会变得非常巨大,使得模型的计算成本也会随之增加。

神经网络语言模型

神经网络语言模型是利用神经网络方法进行语言建模的一种模型。它的输入是一连串的单词,输出是单词序列中每个单词的条件概率,该概率取决于单词的上下文。

神经网络语言模型的核心思想是,利用深度神经网络中的隐藏层状态来对单词的历史序列进行编码,从而预测下一个单词。首先,将每个单词都通过一个词向量进行编码,接下来,将这些词向量作为输入通过一个循环神经网络层(RNN)进行顺序计算,由此得到一个由隐藏层状态(hidden states)组成的序列。对于每个隐藏层状态,我们可以预测下一个单词的概率,在多次迭代计算中,网络的训练目标就是最大限度地提高这些预测的准确性。

具体来说,给定一个单词序列w1,w2,...,wtw_1,w_2,...,w_t,我们的目标是最大化条件概率P(w1,w2,...,wt)P(w_1,w_2,...,w_t)。通过链式规则,该概率可以表示为:

P(w1,w2,...,wt)=i=1tP(wiw1,...,wi1)P(w_1,w_2,...,w_t) = \prod_{i=1}^{t}P(w_i|w_1,...,w_{i-1})

神经网络语言模型试图学习每个单词出现的条件概率。具体来说,它使用了一个神经网络结构,可以将前面出现的单词转化为向量,并将它们映射到神经网络的隐藏层状态,该状态可以用来预测下一个单词。由于网络需要保持对过去信息的记忆,而循环神经网络(RNN)可以存储最近的历史信息,并使用其作为输入来预测接下来的单词,因此RNN被广泛用于实现神经网络语言模型。

常见的神经网络语言模型包括基于Elman网络和长短时记忆(LSTM)的语言模型。LSTM是一种特殊类型的循环神经网络,它可以有效地处理长序列信息,具有很好的记忆能力,因此在语言建模任务中表现良好。

实际中,训练神经网络语言模型的关键是减轻过拟合问题。常用的方法包括使用dropout来防止过度拟合,使用early stopping来防止训练过多导致的过拟合,以及使用正则化方法和限制权重大小等技巧来减轻过度拟合问题。

总的来说,神经网络语言模型是一种无需手动精心设计特征的可端到端的语言建模方法,能够有效地学习高阶语言结构和长文本依赖性,是自然语言处理任务中一个重要的基础模型。

简单介绍词法分析、句法分析和语义分析的基本概念和方法。

词法分析、句法分析和语义分析是自然语言处理中的三个基本分析任务,下面对它们的基本概念和方法进行介绍。

  1. 词法分析

词法分析,也称为分词,是自然语言处理的起点,其任务是将文本分割为有意义的单词序列。在中文中,由于没有空格或标点符号分隔单词,因此中文的分词比英文更具挑战性。词法分析一般包括以下几个子任务:识别单词、识别个词的词性和提取共现关系等。常用的方式有规则匹配、统计方法和深度学习方法等。

  1. 句法分析

句法分析,也称为语法分析,是指将句子分析为一个层次结构的成分和语法关系,例如词汇、短语、从句等,并将其转化为语法结构树或依存关系图。句法分析可以帮助我们理解句子中单词之间的语法规则和句法结构,有助于自然语言理解、翻译和生成等任务。句法分析的方法包括基于规则的语法模型、基于统计的概率模型和基于神经网络的深度学习模型等。

  1. 语义分析

语义分析是指将自然语言的句子、段落或文档转化为一个或多个含义的表示形式,即将表面文本转化为语义信息。语义分析任务的目的是使计算机对自然语言表达理解得更深入,能够对自然语言进行推理和理解,例如问答、自动摘要、机器翻译等。语义分析方法包括基于规则的知识表示和推理方法、统计方法和深度学习方法等。常见的语义分析任务包括命名实体识别、关键词提取、情感分析、语义角色标注和语义解释等。

总之,词法分析、句法分析和语义分析是自然语言处理中的三个基本任务,它们为后续的自然语言处理任务如机器翻译、自动问答等提供了基础和支持。

简要总结神经语言模型的发展历程。

神经语言模型(Neural Language Model,NLM)是一种用于自然语言处理的模型,旨在解决语言模型中的诸多问题,如数据稀疏性、数据平滑等。它的发展历程如下:

  1. N-gram语言模型

N-gram语言模型是一种基于统计的语言模型,早期的语言模型都是基于这种方法的。它假设当前单词出现的概率只与前面n-1个词有关,即假定文本的生成是马尔可夫过程,根据马尔可夫链的性质,当前状态只与前面的有限若干状态有关。因此,N-gram语言模型只需估计每个单词和前面n-1个单词的共现概率即可预测下一个单词。虽然该模型简单易用,但它只能考虑到一部分局部特征,忽略了句子间的长程依赖关系。

  1. 基于神经网络的语言模型

为了解决N-gram语言模型的问题,随着计算机硬件的发展和神经网络的兴起,研究者们开始探索基于神经网络的语言模型。最早的基于神经网络的语言模型是RNN语言模型,它使用一个循环神经网络来捕捉句子的历史信息,并预测下一个单词。但是,由于RNN存在梯度消失、梯度爆炸等问题,导致模型无法有效学习长文本序列的依赖关系。因此,后来又出现了基于LSTM和GRU的语言模型,这些模型使用门控机制来解决了RNN模型的问题,但是它们的计算开销较大,并且仍然难以解决长序列的依赖问题。

  1. 基于Transformer的语言模型

2017年,Google提出的Transformer模型引起了广泛关注,Transformer模型使用了自注意力机制和多头注意力机制来代替了基于循环的神经网络结构,并使用了残差连接和层规范化等技术来加速和稳定模型的训练。在该模型的基础上,研究者们提出了BERT、GPT等预训练模型,进一步扩大了神经语言模型的应用范围和效果。

除了上述模型之外,还有很多研究人员尝试在神经语言模型中加入目标任务信息或生成模型方法等,这些方法适用于不同的任务类型和应用场景。总之,神经语言模型在自然语言处理领域有着广泛的应用和重要的地位,未来还有很大的发展空间。

Word2Vec

Word2Vec 是一种将自然语言中的词语映射到向量空间的模型,它的产生可以追溯到 2013 年由 Google 提出的两种模型:CBOW 和 Skip-gram。

Word2Vec 将每个词语表示为一个实数向量,可以方便地进行相似词查询、词的聚类、词义推断等任务。它的基本思想是,根据语料库中的共现信息来学习每个词汇的向量表示,即在一个窗口内同时出现的词汇很可能有相似的语义。Word2Vec 模型会在大量文本数据上学习词汇的分布式表示,使得相似的单词能够被映射到彼此相邻的位置。

Word2Vec 的两种模型:

  1. CBOW(Continuous Bag-of-Words)模型,通过上下文中的单词预测当前单词的概率,即预测当前词语的周围文本。

  2. Skip-gram 模型,与 CBOW 相反,它通过当前单词预测上下文单词的分布,即预测当前词语的周围文本。

Word2Vec 模型的训练需要一个大规模的文本语料库,通常使用无监督学习的方法进行大规模训练。在模型训练过程中,我们需要选择 hyperparameters,例如嵌入维度、窗口大小、负采样次数等。训练结束后,我们可以使用训练好的 Word2Vec 模型进行各种自然语言处理应用,例如文本分类、主题模型、情感分析等。

总之,Word2Vec 是一种基于词向量表达的文本特征表示方式,可以在自然语言处理中得到广泛的应用。

TextCNN

TextCNN(卷积神经网络)是一种基于卷积神经网络的文本分类模型,常用于短文本分类和情感分析。它使用一维卷积神经网络对文本进行特征提取,从而能够自动学习词汇中的语义信息。相较于传统的文本分类模型,如朴素贝叶斯和支持向量机等,TextCNN不需要手动提取特征,只需要将原始文本输入到模型中即可完成分类任务。

TextCNN 的架构通常包括卷积层、池化层和全连接层。卷积层用于提取文本中的特征,池化层用于对卷积层输出进行下采样并保留重要的特征,全连接层则用于将池化层的输出映射到分类结果。具体来说:

  1. 首先将文本表示为词向量的矩阵,即每行表示一个词语的词向量,每个词向量的维度为dd
  2. 对词向量矩阵进行卷积操作,生成卷积特征图。
  3. 经过池化操作,得到下采样后的特征图。
  4. 将池化层的输出连接到一个或多个全连接层上,在全连接层中进行分类或者回归任务。

在训练模型时,我们需要使用交叉熵(cross-entropy)损失函数来度量模型预测结果与真实标签的差异,同时使用随机梯度下降(SGD)或者其他优化算法来优化模型参数,使得预测结果更加接近真实标签。训练过程中通常需要进行一些超参数调整,例如卷积核大小、池化方式、学习率等,从而提升模型的性能和泛化能力。

总之,TextCNN 模型适用于文本分类、情感分析等短文本领域,在实践中有着广泛的应用和深入的研究。

问题

jieba分词时数据存在空数据

“cut_all=False” 是 Python 第三方分词库 jieba 分词的参数之一。cut_all 是 jieba 分词的一个可选参数,在默认情况下值为 False,表示采用精确模式进行分词。如果设置为 True,则采用全模式或搜索引擎模式进行分词。

  • 精确模式:试图将句子最精确地切开,适合文本分析;
  • 全模式:把句子中所有可能是词语的部分都切出来,适合用于文本匹配;
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

因此,当设置为 False 时,表示采用精确模式进行分词,这种模式下 jieba 会根据词典和规则进行最精确的分词,适用于各种文本分析场景。

jieba.cut()不支持传入空

1
2
3
4
5
print(review[2])
print(type(review[2])) # 检查 review[2] 的数据类型

6375条评论 nan
<class 'float'>

image-20230607210935604

优化流程——先去除标点符号,后分词

在中文文本情感分析中也是应该先去除标点符号,再对文本进行分词操作。因为在中文文本中,标点符号同样是一个常见的噪声信号,去除它们可以使得文本处理更加准确和规范。同时,中文分词是非常必要的步骤,因为中文单个汉字并不能够完整地表示语义,必须将中文文本划分为一个个有意义的词汇才能进行后续的特征提取和分析。所以,在中文文本情感分析中,先去除标点符号,再进行分词是一个常见的数据预处理步骤。

bug——加载模型

(155条消息) 加载模型时报错:model_config = json.loads(model_config.decode(‘utf-8‘))_袖子味的博客-CSDN博客

image-20230610151917041

结果

版本1

{‘loss’: [0.6289256131746247, 0.2952525206557874, 0.1915451713221399, 0.10784940849202056, 0.061670292124878213, 0.037185402453124815, 0.024271634350570583, 0.026300059186494973, 0.024789967891016753, 0.043766194115507105], ‘acc’: [0.7550977, 0.87486583, 0.92788154, 0.9624383, 0.9808972, 0.98798025, 0.9933462, 0.99184376, 0.99119985, 0.9834728], ‘val_loss’: [0.33206379237093125, 0.30265515625732653, 0.34509098252257564, 0.3856908023996926, 0.3821902819457484, 0.41400474158031747, 0.4748424635680448, 0.613759620506876, 0.5375576313473124, 0.5281308173493766], ‘val_acc’: [0.855794, 0.8695279, 0.8532189, 0.8523605, 0.86523604, 0.8635193, 0.85751075, 0.8566524, 0.8540773, 0.8669528]}
[0.7550977, 0.87486583, 0.92788154, 0.9624383, 0.9808972, 0.98798025, 0.9933462, 0.99184376, 0.99119985, 0.9834728]
Test accuracy: 0.86714727
[0.7550977, 0.87486583, 0.92788154, 0.9624383, 0.9808972, 0.98798025, 0.9933462, 0.99184376, 0.99119985, 0.9834728]

image-20230608201230550