nlp入门之新闻分类实验

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 本文使用sougouCy数据集,对收集到的新闻数据进行分类

源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com)

数据来源:

搜狗新闻语料库 由于链接失效,现在使用百度网盘分享

链接:https://pan.baidu.com/s/1RTx2k7V3Ujgg9-Rv8I8IRA?pwd=ujn3

提取码:ujn3

停用词 来源于网络

链接:https://pan.baidu.com/s/1ePrf4_gWx8_pTn6PEjTtCw?pwd=5jov

提取码:5jov

字样式文件 来源于网络

链接:https://pan.baidu.com/s/1uVreJY-MKhz1HXzAw5e4VQ?pwd=8ill

提取码:8ill

一、tf-idf简介

TF = 某词在文章中出现的次数/该文章中出现最多词出现的次数

IDF = log(文章总数/包含该词的文章数+1)

TF-IDF = TF * IDF

二、加载数据集

# 载入数据集df_news=pd.read_table('./data/val.txt', names=['category', 'theme', 'URL', 'content'], encoding='utf-8')
df_news=df_news.dropna()
print(df_news.head())
print(df_news.shape)


可以看到有5000行4列的数据,其中第一列可以作为新闻分类的标签,最后一列为新闻内容

三、分词

首先将数据转换为list格式

# 转换为list格式content=df_news.content.values.tolist()
print(content[1000])


将最后一列数据摘出来转换成了一个字符串列表,就可以进行分词操作

# 分词content_S= []
forlineincontent:
current_segment=jieba.lcut(line)
iflen(current_segment) >1andcurrent_segment!='\r\n':
content_S.append(current_segment)
print(content_S[1000])
df_content=pd.DataFrame({'content_S': content_S})
print(df_content.head())


四、去掉停用词

可以看出上面还有许多没有价值的词作干扰,所以我们加载停用词库并且去掉停用词

# 加载停用词stopwords=pd.read_csv('./data/stopwords.txt', index_col=False, sep='\t', quoting=3, names=['stopword'],
encoding='utf-8')
print(stopwords.head(20))
# 去掉停用词defdrop_stopwords(contents, stopwords):
contents_clean= []
all_words= []
forlineincontents:
line_clean= []
forwordinline:
ifwordinstopwords:
continueline_clean.append(word)
all_words.append(str(word))
contents_clean.append(line_clean)
returncontents_clean, all_wordscontents=df_content.content_S.values.tolist()
stopwords=stopwords.stopword.values.tolist()
contents_clean, all_words=drop_stopwords(contents, stopwords)
df_content=pd.DataFrame({'contents_clean': contents_clean})
print(df_content.head())
df_all_words=pd.DataFrame({'all_words': all_words})
print(df_all_words.head())


 

五、计算词频

# 计算词频words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg(count='count')
words_count=words_count.reset_index().sort_values(by=['count'], ascending=False)
print(words_count.head())


六、绘制词云

# 绘制词云wordcloud=WordCloud(font_path='./data/SimHei.ttf', background_color='white', max_font_size=80)
word_frequence= {x[0]: x[1] forxinwords_count.head(100).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
plt.show()


七、使用tf-idf提取关键词

# tf-idfindex=1000print(df_news['content'][index])
content_S_str=''.join(content_S[index])
print(' '.join(jieba.analyse.extract_tags(content_S_str, topK=5, withWeight=False)))


八、使用主题模型提取关键词

# LDAdictionary=corpora.Dictionary(contents_clean)
corpus= [dictionary.doc2bow(sentence) forsentenceincontents_clean]
lda=gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
print(lda.print_topic(1, topn=5))
fortopicinlda.print_topics(num_topics=20, num_words=5):
print(topic[1])


可以看出第一类词的成分权重

这是所有类型的词成分权重

九、使用贝叶斯算法进行分类

# 贝叶斯算法进行分类df_train=pd.DataFrame({'contents_clean': contents_clean, 'label': df_news['category']})
print(df_train.tail())
print(df_train.label.unique())
label_mapping= {'汽车': 1, '财经': 2, '科技': 3, '健康': 4, '体育': 5, '教育': 6, '文化': 7, '军事': 8, '娱乐': 9,
'时尚': 0}
df_train['label'] =df_train['label'].map(label_mapping)
print(df_train.head())
x_train, x_test, y_train, y_test=train_test_split(df_train['contents_clean'].values, df_train['label'].values)
print(x_train[0][1])
words= []
forline_indexinrange(len(x_train)):
words.append(' '.join(x_train[line_index]))
print(words[0])
print(len(words))
# 计算词频构造向量vec=CountVectorizer(analyzer='word', max_features=4000, lowercase=False)
vec.fit(words)
classifier=MultinomialNB()
classifier.fit(vec.transform(words), y_train)
test_words= []
forline_indexinrange(len(x_test)):
test_words.append(' '.join(x_test[line_index]))
print(test_words[0])
print(len(test_words))
print(classifier.score(vec.transform(test_words), y_test))
# tf-idf构造词向量vec2=TfidfVectorizer(analyzer='word', max_features=4000, lowercase=False)
vec2.fit(words)
classifier=MultinomialNB()
classifier.fit(vec2.transform(words), y_train)
print(classifier.score(vec2.transform(test_words), y_test))
# 词频构造多维向量形式构造词向量vec3=CountVectorizer(analyzer='word', max_features=4000, lowercase=False, ngram_range=(1, 2))
vec3.fit(words)
classifier=MultinomialNB()
classifier.fit(vec3.transform(words), y_train)
print(classifier.score(vec3.transform(test_words), y_test))
# tfidf构造多维向量形式构造词向量vec4=TfidfVectorizer(analyzer='word', max_features=4000, lowercase=False, ngram_range=(1, 2))
vec4.fit(words)
classifier=MultinomialNB()
classifier.fit(vec4.transform(words), y_train)
print(classifier.score(vec4.transform(test_words), y_test))


可以看出不同方法构成词向量对结果产生了影响,使用tf-idf方法构建词向量比单纯使用词频构建词向量准确率高一些,将词向量扩充多维比不扩充准确率稍微高一些

 

相关文章
|
自然语言处理 数据挖掘 语音技术
自然语言处理的分类
自然语言处理的分类
|
自然语言处理 算法 数据可视化
NLP7:综合实验
NLP7:综合实验
199 0
NLP7:综合实验
|
机器学习/深度学习 人工智能 自然语言处理
【人工智能技术专题】「入门到精通系列教程」零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP自然语言处理概念介绍)
【人工智能技术专题】「入门到精通系列教程」零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP自然语言处理概念介绍)
1123 0
|
机器学习/深度学习 自然语言处理 算法
【从零开始学习深度学习】49.Pytorch_NLP项目实战:文本情感分类---使用循环神经网络RNN
【从零开始学习深度学习】49.Pytorch_NLP项目实战:文本情感分类---使用循环神经网络RNN
|
机器学习/深度学习 数据采集 自然语言处理
【NLP-新闻文本分类】处理新闻文本分类所有开源解决方案汇总
汇总了多个用于新闻文本分类的开源解决方案,包括TextCNN、Bert、LSTM、CNN、Transformer以及多模型融合方法。
835 1
|
机器学习/深度学习 存储 自然语言处理
【NLP-新闻文本分类】3 Bert模型的对抗训练
详细介绍了使用BERT模型进行新闻文本分类的过程,包括数据集预处理、使用预处理数据训练BERT语料库、加载语料库和词典后用原始数据训练BERT模型,以及模型测试。
497 1
|
机器学习/深度学习 数据采集 监控
【NLP-新闻文本分类】2特征工程
本文讨论了特征工程的重要性和处理流程,强调了特征工程在机器学习中的关键作用,并概述了特征工程的步骤,包括数据预处理、特征提取、特征处理、特征选择和特征监控。
434 1
|
数据采集 自然语言处理 数据挖掘
【NLP-新闻文本分类】1 数据分析和探索
文章提供了新闻文本分类数据集的分析,包括数据预览、类型检查、缺失值分析、分布情况,指出了类别不均衡和句子长度差异等问题,并提出了预处理建议。
436 1
|
机器学习/深度学习 人工智能 自然语言处理
自然语言处理(NLP)技术入门指南
【5月更文挑战第3天】本文是自然语言处理(NLP)技术的入门指南,介绍了NLP的基本概念、关键技术和学习建议。NLP旨在实现人机自然语言交互,应用于机器翻译、文本分类等领域。核心技术包括词法分析、句法分析、语义分析及深度学习模型。入门学习需掌握基础知识,动手实践,关注前沿技术并持续学习。通过学习NLP,可为人工智能发展贡献力量。
1523 8
|
机器学习/深度学习 自然语言处理 PyTorch
【NLP】讯飞英文学术论文分类挑战赛Top10开源多方案--6 提分方案
在讯飞英文学术论文分类挑战赛中的提分技巧和实现方法,包括数据增强、投票融合、伪标签等策略,以及加快模型训练的技巧,如混合精度训练和使用AdamW优化器等。
227 0