glove文本分类介绍

参考:https://www.biaodianfu.com/glove.html

GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具。

GloVe与word2vec的区别:
两个模型都可以根据词汇的“共现co-occurrence”信息,将词汇编码成一个向量(所谓共现,即语料中词汇一块出现的频率)。两者最直观的区别在于,word2vec是“predictive”的模型,而GloVe是“count-based”的模型。

Predictive的模型,如Word2vec,根据context预测中间的词汇,要么根据中间的词汇预测context,分别对应了word2vec的两种训练方式cbow和skip-gram。对于word2vec,采用三层神经网络就能训练,最后一层的输出要用一个Huffuman树进行词的预测。

Count-based模型,如GloVe,本质上是对共现矩阵进行降维。首先,构建一个词汇的共现矩阵,每一行是一个word,每一列是context。共现矩阵就是计算每个word在每个context出现的频率。由于context是多种词汇的组合,其维度非常大,我们希望像network embedding一样,在context的维度上降维,学习word的低维表示。这一过程可以视为共现矩阵的重构问题,即reconstruction loss。

相比Word2Vec,GloVe更容易并行化,所以对于较大的训练数据,GloVe更快

Glove实现原理:

  1. 构建共现矩阵
    在这里插入图片描述

  2. 词向量和共现矩阵的近似关系
    通过概率的比例而不是概率本身去学习。

  3. 构造损失函数
    在这里插入图片描述

在这里插入图片描述
4. 训练GloVe模型
该模型是有监督学习方式,有label,这个label就是公式中的log(Xij),而公式中的向量w和w~就是要不断更新学习的参数,所以本质上它的训练方式跟监督学习的训练方法没什么不一样,都是基于梯度下降的。

实战:
对于文本分类最简单最常用的比如通过朴素贝叶斯,N-Grams这些方法来做分类识别

1、首先对语料库进行切词,维护自己的词典,做高频词的人工复审,将无意义词语进行stop_words归总

2、进行tf-idf,将词进行重赋权,有效的将向量化中的one hot encoding结果进行了修正。但是依然存在问题:在TFIDF算法中并没有体现出单词的位置信息。

3、在经过TfidfVectorizer处理之后的结果是以稀疏矩阵的形式来存的,如果想看内容的话,可以用todense()转化为matrix来看。接下来,用贝叶斯来训练刚才得到的矩阵结果就可以了。

参考:https://www.biaodianfu.com/glove.html

TF-IDF

参考:https://baike.baidu.com/item/tf-idf/8816134
TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术。TF是词频(Term Frequency),IDF是逆文本频率指数(Inverse Document Frequency)。

介绍:
TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜索引擎还会使用基于链接分析的评级方法,以确定文件在搜寻结果中出现的顺序

原理:
词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率:
在这里插入图片描述
逆向文件频率(inverse document frequency,IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到:
在这里插入图片描述
|D|:语料库中的文件总数
:包含词语的文件数目(即的文件数目)如果该词语不在语料库中,就会导致分母为零,因此一般情况下使用
在这里插入图片描述
作为分母。

在这里插入图片描述
应用:权重计算方法经常会和余弦相似度(cosine similarity)一同使用于向量空间模型中,用以判断两份文件之间的相似性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现基于GloVe的中文微博评论文本分类的示例代码,其中使用了gensim库和jieba库: ```python import jieba import numpy as np from gensim.models import KeyedVectors from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from keras.preprocessing.sequence import pad_sequences from keras.models import Sequential from keras.layers import Dense, Dropout, Embedding, LSTM # 准备中文微博评论数据集,这里用的是一个文本文件 data = [] labels = [] with open('weibo_comments.txt', 'r', encoding='utf-8') as f: for line in f: # 每一行数据包括评论和标签,用空格分隔 label, comment = line.strip().split(' ') data.append(comment) labels.append(label) # 对标签进行编码 label_encoder = LabelEncoder() labels = label_encoder.fit_transform(labels) # 对微博评论进行分词 sentences = [] for comment in data: words = list(jieba.cut(comment)) sentences.append(words) # 加载预训练好的GloVe词向量 word_vectors = KeyedVectors.load_word2vec_format('glove.word2vec.txt', binary=False) # 将分好词的微博评论转换为词向量序列 embedding_size = 100 max_sequence_length = 100 embedding_matrix = np.zeros((len(word_vectors.vocab), embedding_size)) for i, word in enumerate(word_vectors.index2word): if i >= len(word_vectors.vocab): break embedding_vector = word_vectors[word] if embedding_vector is not None: embedding_matrix[i] = embedding_vector data_sequences = [] for sentence in sentences: sequence = [] for word in sentence: if word in word_vectors.vocab: sequence.append(word_vectors.vocab[word].index) data_sequences.append(sequence) # 对词向量序列进行padding,使其长度相同 data_sequences = pad_sequences(data_sequences, maxlen=max_sequence_length) # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data_sequences, labels, test_size=0.2, random_state=42) # 构建模型 model = Sequential() model.add(Embedding(len(word_vectors.vocab), embedding_size, weights=[embedding_matrix], input_length=max_sequence_length, trainable=False)) model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 batch_size = 32 epochs = 10 model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(X_test, y_test)) # 评估模型 loss, accuracy = model.evaluate(X_test, y_test) print('Test loss:', loss) print('Test accuracy:', accuracy) ``` 在上述代码中,我们使用`jieba`对微博评论进行分词,并使用预训练好的GloVe词向量将分好词的微博评论转换为词向量序列。然后,我们使用Keras构建一个LSTM模型,并使用训练集对模型进行训练。最后,我们使用测试集对模型进行评估。需要注意的是,这里的示例中只是简单地使用了一个文本文件作为数据集,实际应用中需要使用更大的数据集进行训练和测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值