NLP---实践2-文本分类MLDL

项目2:新闻文本挖掘与分类MLDL

一、 文本分析与可视化

  1. 读取数据,去除有缺失值的行,分词
  2. 去除停用词
  3. 统计词频
  4. 做词云

二、 中文自然语言处理分析

1. 关键词提取

1.1 基于TF-IDF算法的关键词抽取
import jieba.analyse
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
  • sentence 为待提取的文本,不需要分词
  • topK 为返回几个 TF-IDF 权重最大的关键词,默认值为 20
  • withWeight 为是否一并返回关键词权重值,默认值为 False
  • allowPOS 仅包括指定词性的词,默认值为空,即不筛选
1.2 基于TextRank算法的关键词抽取
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))

2. LDA主题模型

from gensim import corpora, models, similarities
import genism

# 转换成bag of words的词向量
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
# 进行主题模型计算,类似聚类
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
# 输出第三个topic,与其最具代表性的5个关键词,至于是什么主题,有人自己来定。
print(lda.print_topic(3, topn=5))

三、用机器学习方法完成中文文本分类

1. 使用朴素贝叶斯完成一个中文文本分类器

(1) 读取数据
(2) 分词,去除停用词,并将处理好的每一类别写入文件中,以免重复处理操作。
(3) 打乱数据的顺序

import random
random.shuffle(sentences)

(4) 将数据拆分成训练集与测试集

from sklearn.model_selection import train_test_split
x, y = zip(*sentences)
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1234)

(5) 抽取特征

  • 抽取词袋模型特征,即 unigram。
from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer(
    analyzer='word', # tokenise by character ngrams
    max_features=4000,  # keep the most common 4000 ngrams
)
vec.fit(x_train)

def get_features(x):
    vec.transform(x)

(6) 使用朴素贝叶斯分类器进行训练

from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vec.transform(x_train), y_train)

(7) 在测试集上测试准确率

classifier.score(vec.transform(x_test), y_test)

(8) 提高准确率

  • 添加 2-gram、3-gram 特征,并增加词向量维度
from sklearn.feature_extraction.text import CountVectorizer

vec = CountVectorizer(
    analyzer='word', # tokenise by character ngrams
    ngram_range=(1,4),  # use ngrams of size 1, 2, 3, 4
    max_features=20000,  # keep the most common 2000 ngrams
)
vec.fit(x_train)

def get_features(x):
    vec.transform(x)

(9) 交叉验证

  • 关于kFold交叉验证参考:

    https://www.jianshu.com/p/284581d9b189

    补充概念:
    偏差: 描述模型输出结果的期望与样本真实结果的差距。
    方差: 描述模型对于给定值的输出稳定性。

  • 这里使用的是 StratifiedKFold,即分层的 kFold交叉验证,确保训练集,测试集中各类别样本的比例与原始数据集中相同。

from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import accuracy_score, precision_score
import numpy as np

def stratifiedkfold_cv(x, y, clf_class, shuffle=True, n_folds=5, **kwargs):
    stratifiedk_fold = StratifiedKFold(n_splits=n_folds, shuffle=shuffle)
    y_pred = y[:]
    for train_index, test_index in stratifiedk_fold.split(x, y):
        X_train, X_test = x[train_index], x[test_index]
        y_train = y[train_index]
        clf = clf_class(**kwargs)
        clf.fit(X_train,y_train)
        y_pred[test_index] = clf.predict(X_test)
    return y_pred 

NB = MultinomialNB
print(precision_score(y, stratifiedkfold_cv(vec.transform(x),np.array(y),NB), average='macro'))

2. 同理可使用LR、SVM完成中文文本分类

四、基于spark的机器学习方法完成中文文本分类

  • 将以上机器学习中的函数调用换成相应spark中的函数调用。

五、FastText中文分类

  • fastText的文本输入格式:__label__类别 , 分词的文本,例如:
    __label__科技 , 人工智能 在 各个 领域 应用 越来越多 。
  • windows上安装python版的fasttext有问题,需要寻找解决方法。

六、textCNN 文本分类

  • 详细参见jupyter notebook

七、textRNN

八、textBiRNN

九、text-RCNN

十、双向注意力LSTM神经网络文本分类

十一、HAN (层叠注意力) 神经网络文本分类

  • HAN:Hierarchical Attention Networks

十二、tensorflow深度学习文本分类模型部署

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值