翼度科技»论坛 编程开发 python 查看内容

nlp入门(四)新闻分类实验

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (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
二、加载数据集
  1. # 载入数据集
  2. df_news = pd.read_table('./data/val.txt', names=['category', 'theme', 'URL', 'content'], encoding='utf-8')
  3. df_news = df_news.dropna()
  4. print(df_news.head())
  5. print(df_news.shape)
复制代码

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

首先将数据转换为list格式
  1. # 转换为list格式
  2. content = df_news.content.values.tolist()
  3. print(content[1000])
复制代码

 将最后一列数据摘出来转换成了一个字符串列表,就可以进行分词操作
  1. # 分词
  2. content_S = []
  3. for line in content:
  4.     current_segment = jieba.lcut(line)
  5.     if len(current_segment) > 1 and current_segment != '\r\n':
  6.         content_S.append(current_segment)
  7. print(content_S[1000])
  8. df_content = pd.DataFrame({'content_S': content_S})
  9. print(df_content.head())
复制代码

 四、去掉停用词

可以看出上面还有许多没有价值的词作干扰,所以我们加载停用词库并且去掉停用词
  1. # 加载停用词
  2. stopwords = pd.read_csv('./data/stopwords.txt', index_col=False, sep='\t', quoting=3, names=['stopword'],
  3.                         encoding='utf-8')
  4. print(stopwords.head(20))
  5. # 去掉停用词
  6. def drop_stopwords(contents, stopwords):
  7.     contents_clean = []
  8.     all_words = []
  9.     for line in contents:
  10.         line_clean = []
  11.         for word in line:
  12.             if word in stopwords:
  13.                 continue
  14.             line_clean.append(word)
  15.             all_words.append(str(word))
  16.         contents_clean.append(line_clean)
  17.     return contents_clean, all_words
  18. contents = df_content.content_S.values.tolist()
  19. stopwords = stopwords.stopword.values.tolist()
  20. contents_clean, all_words = drop_stopwords(contents, stopwords)
  21. df_content = pd.DataFrame({'contents_clean': contents_clean})
  22. print(df_content.head())
  23. df_all_words = pd.DataFrame({'all_words': all_words})
  24. print(df_all_words.head())
复制代码

 

 五、计算词频
  1. # 计算词频
  2. words_count = df_all_words.groupby(by=['all_words'])['all_words'].agg(count='count')
  3. words_count = words_count.reset_index().sort_values(by=['count'], ascending=False)
  4. print(words_count.head())
复制代码

 六、绘制词云
  1. # 绘制词云
  2. wordcloud = WordCloud(font_path='./data/SimHei.ttf', background_color='white', max_font_size=80)
  3. word_frequence = {x[0]: x[1] for x in words_count.head(100).values}
  4. wordcloud = wordcloud.fit_words(word_frequence)
  5. plt.imshow(wordcloud)
  6. plt.show()
复制代码

 七、使用tf-idf提取关键词
  1. # tf-idf
  2. index = 1000
  3. print(df_news['content'][index])
  4. content_S_str = ''.join(content_S[index])
  5. print(' '.join(jieba.analyse.extract_tags(content_S_str, topK=5, withWeight=False)))
复制代码

 八、使用主题模型提取关键词
  1. # LDA
  2. dictionary = corpora.Dictionary(contents_clean)
  3. corpus = [dictionary.doc2bow(sentence) for sentence in contents_clean]
  4. lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
  5. print(lda.print_topic(1, topn=5))
  6. for topic in lda.print_topics(num_topics=20, num_words=5):
  7.     print(topic[1])
复制代码

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

 这是所有类型的词成分权重
九、使用贝叶斯算法进行分类
  1. # 贝叶斯算法进行分类
  2. df_train = pd.DataFrame({'contents_clean': contents_clean, 'label': df_news['category']})
  3. print(df_train.tail())
  4. print(df_train.label.unique())
  5. label_mapping = {'汽车': 1, '财经': 2, '科技': 3, '健康': 4, '体育': 5, '教育': 6, '文化': 7, '军事': 8, '娱乐': 9,
  6.                  '时尚': 0}
  7. df_train['label'] = df_train['label'].map(label_mapping)
  8. print(df_train.head())
  9. x_train, x_test, y_train, y_test = train_test_split(df_train['contents_clean'].values, df_train['label'].values)
  10. print(x_train[0][1])
  11. words = []
  12. for line_index in range(len(x_train)):
  13.     words.append(' '.join(x_train[line_index]))
  14. print(words[0])
  15. print(len(words))
  16. # 计算词频构造向量
  17. vec = CountVectorizer(analyzer='word', max_features=4000, lowercase=False)
  18. vec.fit(words)
  19. classifier = MultinomialNB()
  20. classifier.fit(vec.transform(words), y_train)
  21. test_words = []
  22. for line_index in range(len(x_test)):
  23.     test_words.append(' '.join(x_test[line_index]))
  24. print(test_words[0])
  25. print(len(test_words))
  26. print(classifier.score(vec.transform(test_words), y_test))
  27. # tf-idf构造词向量
  28. vec2 = TfidfVectorizer(analyzer='word', max_features=4000, lowercase=False)
  29. vec2.fit(words)
  30. classifier = MultinomialNB()
  31. classifier.fit(vec2.transform(words), y_train)
  32. print(classifier.score(vec2.transform(test_words), y_test))
  33. # 词频构造多维向量形式构造词向量
  34. vec3 = CountVectorizer(analyzer='word', max_features=4000, lowercase=False, ngram_range=(1, 2))
  35. vec3.fit(words)
  36. classifier = MultinomialNB()
  37. classifier.fit(vec3.transform(words), y_train)
  38. print(classifier.score(vec3.transform(test_words), y_test))
  39. # tfidf构造多维向量形式构造词向量
  40. vec4 = TfidfVectorizer(analyzer='word', max_features=4000, lowercase=False, ngram_range=(1, 2))
  41. vec4.fit(words)
  42. classifier = MultinomialNB()
  43. classifier.fit(vec4.transform(words), y_train)
  44. print(classifier.score(vec4.transform(test_words), y_test))
复制代码






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

来源:https://www.cnblogs.com/zhangshihang/p/17619471.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具