【Python5】文本分类综合(rnn,cnn,word2vec,TfidfVectorizer)
发布日期:2021-04-30 21:00:44 浏览次数:150 分类:精选文章

本文共 2504 字,大约阅读时间需要 8 分钟。

中文评论情感分析

需要的库

我们需要安装以下库:

  • jiebagensim,用于中文分词和词向量模型
  • matplotlib 用于绘制图表

安装命令:

pip install jieba gensim matplotlib

预训练词向量

下载预训练的中文词向量模型,例如:

  • GitHub链接:https://github.com/Embedding/Chinese-Word-Vectors
  • 提取码:fgux

加载词向量:

from gensim.models import KeyedVectorscn_model = KeyedVectors.load_word2vec_format('chinese_word_vectors/sgns.zhihu.bigram', binary=False)

词向量模型

每个词对应一个300维的向量。模型处理流程:

  • 原始文本
  • 分词
  • 索引化
  • 词向量化
  • RNN(如LSTM、GRU等)
  • 激活函数(如Sigmoid)
  • 训练语料

    使用酒店评论语料,共4000个样本,2000正面和2000负面。

    数据处理:

    import ospos_txts = os.listdir('pos')neg_txts = os.listdir('neg')train_texts_orig = []for i in range(len(pos_txts)):    with open('pos/' + pos_txts[i], 'r', errors='ignore') as f:        text = f.read().strip()        train_texts_orig.append(text)for i in range(len(neg_txts)):    with open('neg/' + neg_txts[i], 'r', errors='ignore') as f:        text = f.read().strip()        train_texts_orig.append(text)

    分词与索引化

    去掉标点符号,使用jieba分词,并将词转换为词向量索引:

    import jiebacut_list = []for text in train_texts_orig:    text = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", text)    cut = jieba.cut(text)    cut_list.append([i for i in cut if i in cn_model.vocab])

    索引长度标准化

    计算文本长度分布,取平均长度加上标准差:

    num_tokens = np.array([len(tokens) for tokens in train_tokens])max_tokens = np.mean(num_tokens) + 2 * np.std(num_tokens)

    模型构建

    使用Keras搭建LSTM模型:

    from keras.models import Sequentialfrom keras.layers import Embedding, LSTM, Dense, Bidirectionalmodel = Sequential()model.add(Embedding(num_words, embedding_dim, weights=[embedding_matrix], input_length=max_tokens, trainable=False))model.add(Bidirectional(LSTM(units=32, return_sequences=True)))model.add(LSTM(units=16, return_sequences=False))model.add(Dense(1, activation='sigmoid'))

    训练与评估

    定义优化器和回调:

    from keras.optimizers import Adam, RMSpropfrom keras.callbacks import EarlyStopping, ModelCheckpoint, TensorBoard, ReduceLROnPlateaumodel.compile(loss='binary_crossentropy', optimizer=Adam(lr=1e-3), metrics=['accuracy'])

    预测函数

    预测文本情感:

    def predict_sentiment(text):    text = re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。?、~@#¥%……&*()]+", "", text)    cut = jieba.cut(text)    cut_list = [i for i in cut if i in cn_model.vocab]    tokens_pad = pad_sequences([cut_list], maxlen=max_tokens, padding='pre', truncating='pre')    result = model.predict(tokens_pad)    coef = result[0][0]    if coef >= 0.5:        return '正面评价', coef    else:        return '负面评价', coef

    错误分类分析

    计算误分类样本:

    misclassified = np.where(y_pred != y_actual)[0]print(len(misclassified))

    CNN模型(Tensorflow)

    word2vec模型

    TfidfVectorizer模型

    上一篇:MYSQL--三种锁
    下一篇:centos 7防火墙firewalld.service

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2026年05月23日 16时31分24秒