python利用結巴分詞做新聞地圖
應用語言學的期末Pre花了差不多一個月零零碎碎的時間完成了。最初的打算爬取網易、新浪、騰訊的國內新聞,再通過提取關鍵詞,比較這三個網站社會新聞報道的內容的傾向性。使用結巴分詞進行切分,再統計地名詞頻,進而資料視覺化得出到底哪些地方大新聞比較多。
本來作為一個語言學學生,非常希望從專業的角度分析一下結巴分詞的錯誤案例,於是我爬取了300個新聞標題,並且進行了分類,但是發現……看不懂原始碼的話,最多說這個是什麼成分什麼成分的錯,但是顯然有語感的人都看得出這些分詞是錯的(攤手)。
但是不管怎麼說,也算是一次較為完整的程式碼實踐,打算依次記錄下來。
爬蟲爬取新浪新聞
#encoding = utf-8
import requests
import json
def getnews(pages):
global newsbag
newsbag = []
for page in range(1, pages + 1):
raw_url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_'
'2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=10&show_num=100'
'&tag=1&format=json&page={}&callback=newsloadercallback&_=1487824946231'
url = raw_url.format(page)
res = requests.get(url)
jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');'))
diclist = jd['result']['data']
for ent in diclist:
newsbag.append(ent['title'])
continue
return newsbag
pages = int(input("你想查詢(返回輸入值的100倍):"))
#因為使用的是控制下拉頁載入的連結,所以每次都是抓取固定值,我設定的是100,可以通過調節 show_num 自己調整。使用一個數值較大的效率會高點。
getnews(pages)
後來想能夠查指定日期的新聞標題,於是把時間戳也爬取了下來,並且做成了時間-標題的元組放到了列表裡方便以後使用。修改的邏輯是首先抓取一定量的標題,然後再在這個標題裡抓指定日期的新聞。這樣就會有兩個不便:
- 抓的數量要儘可能大才能滿足呼叫需求
- 每次抓取都是定量的,可能最後抓的一部分並沒有把最後一天的新聞抓全
我當時是先去查詢爬取到的最後一條新聞的時間,然後再擴大爬取的總量,確保能把我要的日期的新聞都框在裡面。
改進後的可以按日期查詢新聞的程式碼如下
#encoding = utf-8 import requests import json def getnews(pages): global newsbag newsbag = [] titlelist = [] timelist=[] for page in range(1,pages+1): raw_url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=100&tag=1&format=json&page={}&callback=newsloadercallback&_=1487824946231' url=raw_url.format(page) res = requests.get(url) jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');')) diclist = jd['result']['data'] for ent in diclist: timestamp =float(ent['createtime']) newstime = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d') timelist.append(newstime) titlelist.append(ent['title']) newsbag = zip(timelist,titlelist) return newsbag print('新浪國內新聞查詢器v2.0,在定量資料範圍內查詢特定日期的新聞。') pages=int(input('請輸入一共想要查詢的頁數,僅支援輸入正整數,1頁顯示100條:')) date = str(input('請輸入想查詢的日期,格式以2017-04-25為例:')) getnews(pages) for i in newsbag: if i[0] == date: print(i)
使用結巴分詞進行標題的切分
在結巴分詞的安裝上遇到了一些坑,一開始解壓安裝包,使用cmd
安裝一直安裝失敗,顯示的資訊是什麼也忘記了。後來使用最簡單的pip
的方法安裝好了。
結巴分詞是一個優秀的開源專案,雖然後來我得知玻森分詞也提供給開發者少量(但處理我的作業綽綽有餘)的呼叫次數時已經完成了資料採集部分的工作了,不然我一定會使用玻森分詞的。所以如果呼叫數量不大,從準確度的角度考慮,還是選用玻森分詞比較好。
結巴分詞的使用文件寫的也很簡單,但是簡單的另一面是對Python新手不大友好,一開始以為結巴只能輸出迭代物件,後來才發現原來也可以輸出列表。
使用結巴分詞切分新聞標題
# encoding = utf-8 import jieba def cutseg(): seg_list = [] for i in newsbag: seg_list = jieba.lcut(i,cut_all=True)+seg_list return "/".join(seg_list) print(cutseg())
使用結巴分詞後對指定日期的新聞進行切分
結合一下改進過的查詢程式碼後,我們直接使用結巴分詞切分日期的標題,這樣提高了切分的效率。這樣,我們就能得到我們所需要的原始語料了。
#encoding = utf-8 import requests import json import jieba from datetime import datetime print ('haha') def getnews(pages): global newsbag newsbag = [] titlelist = [] timelist=[] for page in range(1,pages+1): raw_url = 'http://api.roll.news.sina.com.cn/zt_list?channel=news&cat_1=gnxw&cat_2==gdxw1||=gatxw||=zs-pl||=mtjj&level==1||=2&show_ext=1&show_all=1&show_num=100&tag=1&format=json&page={}&callback=newsloadercallback&_=1487824946231' url=raw_url.format(page) res = requests.get(url) jd = json.loads(res.text.lstrip(' newsloadercallback(').rstrip(');')) diclist = jd['result']['data'] for ent in diclist: timestamp =float(ent['createtime']) newstime = datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d') timelist.append(newstime) titlelist.append(ent['title']) newsbag = zip(timelist,titlelist) return newsbag def cutseg(): title_list = [] for i in timetitle: title_list = title_list+jieba.lcut(i) return title_list print('新浪國內新聞查詢器v2.0,在定量資料範圍內查詢特定日期的新聞。') pages=int(input('請輸入一共想要查詢的頁數,僅支援輸入正整數,1頁顯示100條:')) date = str(input('請輸入想查詢的日期,格式以2017-04-25為例:')) getnews(pages) global timetitle timetitle = [] for i in newsbag: if i[0] == date: timetitle.append(i[1]) print(cutseg())
下一篇,我們將使用搜狗細胞詞庫將新聞標題中的地名挑選出來並且使用pandas進行資料整理!