機器學習項目實戰----新聞分類任務(一)

1、基礎知識

假設有一份文本數據以下,數據量很大,如今要對整個語料庫進行文本分析,category表明新聞種類,theme表明新聞主題,URL表明新聞連接地址,content表明新聞主題內容html

  

停用詞:在content這一列,在數據量很大的狀況,很容易發現某些彷佛與新聞自己意義不大的詞大量出現,而咱們就把這些在語料庫中大量出現可是又沒啥大用的詞叫作停用詞,在數據集連接中包含一份常見的停用詞,以下所示:python

  

TF-IDF:用於關鍵詞提取。好比在一篇名叫《中國的蜜蜂養殖》這篇文章中進行詞頻(Term Frequency,縮寫爲TF)統計出現次數最多的詞是「的」、「是」、「在」等這一類最經常使用的詞(停用詞,通常來講是要去掉的),在刪除掉停用詞事後咱們發現「中國」、「蜜蜂」、「養殖」這三個詞的出現次數同樣多,那麼這三個詞的重要性是同樣的嗎?通常來講"中國"是很常見的詞,相對而言,"蜜蜂"和"養殖"不那麼常見。這時就須要引入一個叫作逆文檔頻率來進行衡量。"逆文檔頻率"(Inverse Document Frequency,縮寫爲IDF)若是某個詞相比較於整個語料庫來講比較少見,可是它在這篇文章中屢次出現,那麼它極可能就反映了這篇文章的特性,那它正是咱們所須要的關鍵詞。app

計算公式spa

  

TF-IDF = 詞頻(TF) * 逆文檔頻率(IDF)仍是在《中國的蜜蜂養殖》這篇文章中:假定該文長度爲1000個詞,"中國"、"蜜蜂"、"養殖"各出現20次,則這三個詞的"詞頻"(TF)都爲0.02。搜索Google發現,包含"的"字的網頁共有250億張,假定這就是中文網頁總數(也就是語料庫)。包含"中國"的網頁共有62.3億張,包含"蜜蜂"的網頁爲0.484億張,包含"養殖"的網頁爲0.973億張。code

  

能夠看出蜜蜂和養殖的TF-IDF值比中國這個詞大,那麼這篇文章的關鍵詞重要性依次爲蜜蜂、養殖和中國。htm

文本類似度假設有以下兩個句子A、B,咱們該怎麼判斷這兩個句子的類似度呢blog

 句子A:我喜歡看電視,不喜歡看電影。
 句子B:我不喜歡看電視,也不喜歡看電影。
先進行分詞來看一下。排序

 句子A:我/喜歡/看/電視,不/喜歡/看/電影。
 句子B:我/不/喜歡/看/電視,也/不/喜歡/看/電影。
能夠獲得整個語料庫:我,喜歡,看,電視,電影,不,也。
而後進行詞頻的統計utf-8

 句子A:我 1,喜歡 2,看 2,電視 1,電影 1,不 1,也 0。
 句子B:我 1,喜歡 2,看 2,電視 1,電影 1,不 2,也 1。
這樣就能夠得出詞頻向量
 句子A:[1, 2, 2, 1, 1, 1, 0]
 句子B:[1, 2, 2, 1, 1, 2, 1]文檔

類似度計算方法:最經常使用經過餘弦進行計算

  

  

2、任務簡介與數據預處理

如今咱們手裏一份新聞數據,數據裏面包含新聞的內容以及新聞的種類等等,咱們要作的就是對新聞進行一個分類任務,好比說汽車類時尚類等等。

數據集連接:https://pan.baidu.com/s/1fG_oagJT69bIgCZgasn_Ig 提取碼:yzd0

導入相關的python庫

import pandas as pd
import jieba  # 若是沒有這個庫可能須要手動安裝

讀取數據集並刪除缺失的數據集(缺失的數據不多,因此能夠刪除) 

# read_table()讀取以‘/t’分割的文件到DataFrame 
# 在實際使用中能夠經過對sep參數的控制來對任何文本文件讀取
df_news = pd.read_table('./data/val.txt',names=['category','theme','URL','content'],encoding='utf-8')
df_news = df_news.dropna() # 刪除缺失數據
df_news.head()

content爲新聞的主體內容

  

查看數據集維度

df_news.shape

獲得的結果

(5000, 4)

新聞內容轉換爲list方便進行分詞並查看第1000條數據內容

content = df_news.content.values.tolist()  # 轉換爲list 其實是二維list
print(content[1000])

內容爲:

阿里巴巴集團昨日宣佈,將在集團管理層面設立首席數據官崗位(Chief Data Officer),阿里巴巴B2B公
司CEO陸兆禧將會出任上述職務,向集團CEO馬雲直接彙報。>菹ぃ和6月初的首席風險官職務任命相同,首席數據官亦爲阿
裏巴巴集團在完成與雅虎股權談判,推動「one company」目標後,在集團決策層面新增的管理崗位。0⒗錛團昨日表示
,「變成一家真正意義上的數據公司」已經是戰略共識。記者劉夏

下面使用python中的jieba庫進行分詞

content_S = []
for line in content:
    # jieba分詞 精確模式。返回一個列表類型,建議使用
    current_segment = jieba.lcut(line)  
    if len(current_segment) > 1 and current_segment != '\r\n':
        content_S.append(current_segment)

查看第1000條數據分詞後的內容

content_S[1000]

  

轉爲pandas支持的DataFrame格式

df_content = pd.DataFrame({'content_S':content_S})   # 轉換爲DataFrame
df_content.head()

分完詞後的結果爲:

  

能夠發現數據裏面包含不少無用的詞彙,因此咱們須要對這些數據進行清洗,就是刪除掉裏面包含的停用詞

3、 刪除停用詞

讀取停用詞表

# 讀取停詞表
stopwords = pd.read_csv('./data/stopwords.txt',index_col=False,sep='\t',quoting=3,names=['stopword'],encoding='utf-8')
stopwords.head()

結果爲:

  

刪除語料庫中的停用詞,這裏面的all_words是爲了後面的詞雲展現。

# 刪除新聞中的停用詞
def drop_stopwords(contents, stopwords):
    contents_clean = [] # 刪除後的新聞
    all_words = []  # 構造詞雲所用的數據
    for line in contents:
        line_clean = []
        for word in line:
            if word in stopwords:
                continue
            line_clean.append(word)
            all_words.append(str(word))
        contents_clean.append(line_clean)
    return contents_clean, all_words


contents = df_content.content_S.values.tolist()
stopwords = stopwords.stopword.values.tolist()
# 獲得刪除停用詞後的新聞以及詞雲數據
contents_clean, all_words = drop_stopwords(contents, stopwords)  

# df_content.content_S.isin(stopwords.stopword)
# df_content=df_content[~df_content.content_S.isin(stopwords.stopword)]
# df_content.head()

查看刪除停用詞後的新聞內容

df_content = pd.DataFrame({'contents_clean':contents_clean})
df_content.head()

從結果能夠看出,此次的數據對比上面的數據來講質量提升了不少。

  

查看一下出現的全部的詞彙,也就是刪除停用詞後的all_words。

df_all_words = pd.DataFrame({'all_words':all_words})
df_all_words.head()

結果爲:

  

統計all_words每一個詞的詞頻,統計這個詞頻也是爲了方便後面的詞雲展現。

import numpy
# 分組統計
words_count = df_all_words.groupby(by=['all_words'])['all_words'].agg({'count':numpy.size})
# 根據count排序
words_count = words_count.reset_index().sort_values(by=['count'],ascending=False)
words_count.head()

結果爲:

  

4、詞雲展現

導入wordcloud庫以及畫圖展現

from wordcloud import WordCloud # 詞雲庫
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize'] = (10.0,5.0)

wordcloud = WordCloud(font_path='./data/simhei.ttf',background_color='white',max_font_size=80)
word_frequence = {x[0]:x[1] for x in words_count.head(100).values} # 這裏只顯示詞頻前100的詞彙
wordcloud = wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)

可視化結果爲:

  

未完待續。。。

 

原文出處:https://www.cnblogs.com/xiaoyh/p/11450479.html

相關文章
相關標籤/搜索