最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬取晉江文學(xué)城小說評論(情緒分析)

 更新時(shí)間:2021年04月19日 14:17:40   作者:海膽奶油飯  
這篇文章主要介紹了使用python爬取晉江文學(xué)城小說評論(情緒分析),全文代碼詳細(xì),邏輯清晰,很適合學(xué)習(xí)爬蟲爬取的朋友,需要的朋友可以參考下

1. 收集數(shù)據(jù)

1.1 爬取晉江文學(xué)城收藏排行榜前50頁的小說信息

獲取收藏榜前50頁的小說列表,第一頁網(wǎng)址為 ‘http://www.jjwxc.net/bookbase.php?fw0=0&fbsj=0&ycx0=0&xx2=2&mainview0=0&sd0=0&lx0=0&fg0=0&sortType=0&isfinish=0&collectiontypes=ors&searchkeywords=&page=1' , 第二頁網(wǎng)址中page=2,以此類推,直到第50頁中page=50。爬取每個(gè)小說的ID,小說名字,小說作者。將爬取到的信息存儲(chǔ)到晉江排行榜【按收藏?cái)?shù)】.txt文件中。

import requests
from bs4 import BeautifulSoup
import bs4
import re
import csv
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import jieba
import seaborn as sns
import xlrd
from xlutils.copy import copy
# 一些魔法命令,使得matplotlib畫圖時(shí)嵌入單元中而不是新開一個(gè)窗口
%matplotlib inline
plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots
plt.rcParams['image.interpolation'] = 'nearest'
plt.rcParams['image.cmap'] = 'gray'
%load_ext autoreload
%autoreload 2
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics
from sklearn.model_selection  import train_test_split
  1. 爬取小說基本信息 ,主要思路;
  2. 找到需要爬取的所有信息主體tbody;
  3. 分別找到每個(gè)信息對應(yīng)的小標(biāo)簽td(a),數(shù)清楚在所有標(biāo)簽中的順序;
  4. 存進(jìn)txt文檔時(shí)按順序存儲(chǔ)。
headers = {"User-Agent": "Mozilla/5.0"}
for n in range(1,50):
    url = 'http://www.jjwxc.net/bookbase.php?fw0=0&fbsj=0&ycx0=0&xx2=2&mainview0=0&sd0=0&lx0=0&fg0=0&sortType=0&isfinish=0&collectiontypes=ors&searchkeywords=&page={}'.format(n)
    html = requests.get(url,headers=headers)
    html.encoding = html.apparent_encoding
    soup = BeautifulSoup(html.text, 'html.parser')
    for tr in soup.find_all('tbody'):
            tds=tr('td')  
            a = tr('a') 
            count=0
            id=[]
            for u in tr.find_all('a'):
                    count=count+1
                    book_url=u.get('href') # 獲取小說主頁的url
                    p = re.compile(r'\d+')
                    book_id = p.findall(book_url)[0]  # 獲取小說ID
                    if(count%2==0):
                        id.append(book_id)
            for n in range(0,100):
                    with open('./data/晉江排行榜【按收藏?cái)?shù)】.txt','a+',encoding='utf-8') as f:
                            print("{0}\t{1}\t{2}".format(id[n],a[n*2+1].string,a[n*2].string),file=f)  # 序號 書名 作者

1.2 查看爬蟲結(jié)果 

分別查看前8部小說的ID和名字

# 查看收藏榜前8部小說的ID
with open('./data/晉江排行榜【按收藏?cái)?shù)】.txt','r',encoding='utf-8',errors='ignore') as f:
    book_list = f.readlines()
    id_list = [item.split('\t')[0] for item in book_list]
print(id_list[:8])
# 查看收藏榜前8部小說的名字
name_list = [item.split('\t')[1] for item in book_list]
print(name_list[:8])

收藏榜前8部小說名字

1.3 ** 爬取每部小說的評論** 。

找到小說的評論區(qū),第一部小說《天官賜福》的第一頁評論網(wǎng)址為 ‘http://www.jjwxc.net/comment.php?novelid=3200611&huati=1' ,3200611是小說ID,1是評論頁數(shù),這部小說第二頁網(wǎng)址為'http://www.jjwxc.net/comment.php?novelid=3200611&huati=2' 。下一部小說《撒野》的ID是2956313,它的第一頁評論網(wǎng)址為'http://www.jjwxc.net/comment.php?novelid=2956313&huati=1' ,以此類推,爬取所有小說的評論和打分。為了避免有一些小說評論數(shù)不夠多,自己設(shè)定每部小說只爬取5頁的評論。

爬取思路與爬取小說信息大致相同,不同的是將爬取到的信息存儲(chǔ)到xls文件中。

headers = {"User-Agent": "Mozilla/5.0"}
with open('./data/晉江排行榜【按收藏?cái)?shù)】.txt','r',encoding='utf-8') as f:
            book_list = f.readlines()
            id_list = [item.split('\t')[0] for item in book_list]
for book_id in id_list:
    for page in range(1,6):
        url="http://www.jjwxc.net/comment.php?novelid={}&huati=1&page={}".format(book_id,page)
        html = requests.get(url,headers=headers)
        html.encoding = html.apparent_encoding
        soup = BeautifulSoup(html.text, 'html.parser')
        scores=[]
        comments=[]
        for item1 in soup.find_all('span',"coltext"):
            score=item1('span')
            scores.append(score[2].string)
        for item2 in soup.find_all('div',"readbody"):
            comment=item2('span')
            comments.append(comment[0].string)
        for i in range(0,len(comments)):
            excel = xlrd.open_workbook('./data/jjwxc1.xls')
            wb = copy(excel)
            w_sheet = wb.get_sheet(0)
            sheet = excel.sheets()[0]
            nrow = sheet.nrows # 文件行數(shù)
            w_sheet.write(nrow, 0, book_id)
            w_sheet.write(nrow, 1, comments[i])
            w_sheet.write(nrow, 2, scores[i])
            wb.save('./data/jjwxc1.xls')

2. 數(shù)據(jù)加載和預(yù)處理

預(yù)處理包括:

  • 格式轉(zhuǎn)化;上一步將爬取信息存到了xls文件,將xls格式文件轉(zhuǎn)化為csv格式文件方便下一步加載。
  • 數(shù)據(jù)去重;爬取過程中某些頁面爬取了多次,導(dǎo)致csv文件包含重復(fù)的行。
  • 短評去重;對同一部小說,或者不同的小說,可能存在評論內(nèi)容相同的行。
  • 添加情緒標(biāo)簽
  • 去除停用詞和分詞
  • 短評可視化

2.1 格式轉(zhuǎn)化

使用pandas模塊可以快速將xls文件轉(zhuǎn)換為.csv

# 格式轉(zhuǎn)化
ex=pd.read_excel("./data/jjwxc.xls")
ex.to_csv("./data/jjwxc.csv",encoding="gb18030")
# 加載評論
review = pd.read_csv("./data/jjwxc.csv",names=['ID','comment','score'],encoding='gb18030')

2.2 數(shù)據(jù)去重

去除重復(fù)的行

# 去重
review = review.drop_duplicates()

2.3 短評去重

去除評論相同的行

# 刪除評論內(nèi)容重復(fù)的行
review= review.drop_duplicates('comment')
review.shape

2.4 添加情緒標(biāo)簽

根據(jù)打分的分?jǐn)?shù)來添加情緒標(biāo)簽,觀察晉江文學(xué)城的打分機(jī)制發(fā)現(xiàn),打分區(qū)間在[-2,2]內(nèi),且打2分的人數(shù)占大多數(shù),于是將分?jǐn)?shù)為2的評論看作是好評,情緒標(biāo)簽為1,而低于2分的看作是差評,情緒標(biāo)簽為0。

# 添加情緒標(biāo)簽
review['emotion'] = (review.score ==2) * 1
# 打亂順序
review = review.sample(frac=1).reset_index(drop=True)
print(review.shape)

2.5 去除停用詞和分詞

短評內(nèi)容進(jìn)行分詞并去掉停用詞

def review_without_stop(review):
    # 打開停用詞文件
    with open("./data/emotion_stopwords.txt","r",encoding="utf-8") as f:
        stop_word = [x.strip() for x in f.readlines()] 
    all_stop_words = set(stop_word) # 刪除停用詞中重復(fù)的項(xiàng)
    # 短評中的非中文字符替換為''
    review = re.sub("[^\u4e00-\u9fa5]",'',review)
    # 去除全角空白字符
    review = review.replace("\u3000","") 
    # 分詞
    review = jieba.cut(review)
    # 過濾一個(gè)字的詞
    review = filter(lambda x: len(x)>1,review)
    # 去除停用詞
    review = filter(lambda x: x not in all_stop_words,review)
    return ' '.join(review)
# 自定義分詞字典
jieba.load_userdict("./data/emotion_userdict.txt")
review['cut_jieba'] = review.comment.apply(review_without_stop)

【注】停用詞和分詞文件需要自己定義

# 查看一些評論
review.head()

查看一些打亂后的評論

# 好評中一些評論包含“不想”,“不喜歡”
review[(review['cut_jieba'] == '不想') & (review['emotion'] == 1)]
review[(review['cut_jieba'] == '不喜歡') & (review['emotion'] == 1)]
# 好評中出現(xiàn)的消極情緒詞,去除這些評論
def change_negtive_like(cut_text):
    word_list = cut_text.split()
    if "不喜歡" in word_list:
        for i in range(len(word_list)):
            if word_list[i] == "不喜歡":
                word_list[i] = ""
        return " ".join(word_list)
    elif "不想" in word_list:
        for i in range(len(word_list)):
            if word_list[i] == "不想":
                word_list[i] = ""
        return " ".join(word_list)
    else:
        return cut_text
review.loc[review['emotion'] == 1,'cut_jieba'] = review[review['emotion'] == 1].cut_jieba.apply(change_negtive_like)
# 一些評論內(nèi)容為空,去除這些為空的評論
review = review[~(review['cut_jieba'] == '')]
review.shape

2.6 短評可視化

對所有短評進(jìn)行可視化

from wordcloud import WordCloud
from imageio import imread
mask = imread("./data/cloud.jpg")
font = './data/FZSTK.TTF'
wc = WordCloud(
    font_path= font,
    max_words=2000, # 設(shè)置最大現(xiàn)實(shí)的字?jǐn)?shù)
    max_font_size=250,# 設(shè)置字體最大值
    background_color = "white",
    random_state=30,
    mask = mask)
wc.generate(''.join(review['cut_jieba'])) # 生成詞云
plt.imshow(wc)
plt.axis('off')

詞云1

 對emotion為1的短評進(jìn)行可視化

from wordcloud import WordCloud
from imageio import imread
mask = imread("./data/piggy.jpg")
font = './data/FZSTK.TTF'
wc1 = WordCloud(
    font_path= font,
    max_words=2000, # 設(shè)置最大現(xiàn)實(shí)的字?jǐn)?shù)
    max_font_size=300,# 設(shè)置字體最大值
    background_color = "white",
    random_state=30,
    mask = mask)
wc1.generate(''.join(review['cut_jieba'][review['emotion']==1]))
plt.imshow(wc1)
plt.axis('off')

詞云2

對score為-2的短評進(jìn)行可視化

wc1.generate(''.join(review['cut_jieba'][review['score']==-2])) # 生成詞云
plt.imshow(wc1)
plt.axis('off')

詞云3

【注】詞云和字體自己定義

3. 訓(xùn)練模型

3.1 建立訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集

由于已經(jīng)為分析準(zhǔn)備好了數(shù)據(jù),所以現(xiàn)在需要將數(shù)據(jù)分成訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集。將數(shù)據(jù)分成兩部分:75%的訓(xùn)練數(shù)據(jù)和25%的測試數(shù)據(jù)。

x, y = review['cut_jieba'], review['emotion']
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.25) 
print(x_train.shape)
print(y_train.shape)
print(x_test.shape)
print(y_test.shape)

3.2 特征提取

使用 sklearn 包中的 TfidfVectorizer 方法進(jìn)行特征提取。

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vect = TfidfVectorizer(decode_error='ignore',
                             token_pattern=r"\b[^\d\W]\w+\b", # 剔除向量化結(jié)果中的數(shù)字
                             analyzer='word',
                             ngram_range=(2,4),
                            max_df = 0.8,
                            min_df = 3)
Xtrain = tfidf_vect.fit_transform(x_train)
Xtest = tfidf_vect.transform(x_test)
print(Xtrain.shape)
print(Xtest.shape)

3.3 用樸素貝葉斯完成中文文本分類器

from sklearn.naive_bayes import MultinomialNB
review_classifier = MultinomialNB()
review_classifier.fit(Xtrain,y_train)
# 對測試集的樣本進(jìn)行預(yù)測
y_pred = review_classifier.predict(Xtest)
metrics.confusion_matrix(y_test, y_pred) # 混淆矩陣
# 利用 sns 模塊查看測試值和預(yù)測值構(gòu)成的熱圖
colorMetrics = metrics.confusion_matrix(y_test, y_pred)
sns.heatmap(colorMetrics,annot=True,fmt='d')

熱圖

# 分類報(bào)告
# 給出每個(gè)類的準(zhǔn)確率,召回率和F值,以及這三個(gè)參數(shù)和宏平均值
print(metrics.classification_report(y_test,y_pred)) 

print(metrics.accuracy_score(y_test,y_pred))
from sklearn.model_selection import cross_val_score
score1 = cross_val_score(review_classifier,Xtrain,y_train,cv=10,scoring="accuracy").mean()
print(score1)

3.4 用邏輯回歸完成中文文本分類

from sklearn.linear_model import LogisticRegression  
LR_model = LogisticRegression(penalty='l2',max_iter=3000)  
LR_model.fit(Xtrain,y_train)
# 對測試集的樣本進(jìn)行預(yù)測
y_pred = LR_model.predict(Xtest)
metrics.confusion_matrix(y_test, y_pred) # 混淆矩陣
print(LR_model.score(Xtest,y_test))
# 給出每個(gè)類的準(zhǔn)確率,召回率和F值,以及這三個(gè)參數(shù)和宏平均值
print(metrics.classification_report(y_test,y_pred))

4. 結(jié)果分析

(1)詞云分析:

  1. 詞云1中最明顯的詞匯是“喜歡”;
  2. 詞云2中的詞匯與詞云1區(qū)別不大,因?yàn)樗卸淘u中好評占大多數(shù);
  3. 由差評生成的詞云3出現(xiàn)了“不好”、“一般”、“硬傷”等負(fù)面色彩的詞語。

(2)影響情感分析準(zhǔn)確性的原因:

  1. 獲取到的短評數(shù)量比較少;
  2. 由于小說中對主角討論比較多,一些小說角色名字會(huì)重復(fù)出現(xiàn)在短評內(nèi),一定程度影響對評論的感情分析;
  3. 沒有刪除過于短小的評論;
  4. 分詞后中發(fā)現(xiàn)代表積極或消極情緒的詞匯往往不會(huì)成為單獨(dú)短評,而是和別的詞一起出現(xiàn),對于查找差評中的積極詞匯和好評中的消極詞匯造成一定困難。
  5. 短評中出現(xiàn)明顯代表正面色彩和負(fù)面色彩的詞匯較少。

到此這篇關(guān)于爬取晉江文學(xué)城小說評論(情緒分析)的文章就介紹到這了,希望對你有所幫助,更多相關(guān)python爬取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django項(xiàng)目如何正確配置日志(logging)

    Django項(xiàng)目如何正確配置日志(logging)

    本文將教你如何在Django項(xiàng)目中正確配置日志(logging),讓Django生成log日志文件,并在程序運(yùn)行發(fā)生error級別故障時(shí)通知管理員。
    2021-04-04
  • Django中session登錄驗(yàn)證操作指南

    Django中session登錄驗(yàn)證操作指南

    本文介紹了如何使用Django中的session登錄驗(yàn)證來保護(hù)網(wǎng)站的安全性。在此過程中,我們首先介紹了Django的認(rèn)證架構(gòu)和基本概念,然后我們深入探討了如何使用session實(shí)現(xiàn)登錄驗(yàn)證功能。最后,我們解釋了如何創(chuàng)建一個(gè)Custom?User?Model,以及如何使用它來自定義用戶對象。
    2023-04-04
  • 讓Python代碼更快運(yùn)行的5種方法

    讓Python代碼更快運(yùn)行的5種方法

    這篇文章主要介紹了讓Python代碼更快運(yùn)行的5種方法,本文分別介紹了PyPy、Pyston、Nuitka、Cython、Numba等開源軟件,可以提升Python的運(yùn)行效率,需要的朋友可以參考下
    2015-06-06
  • Python利用ORM控制MongoDB(MongoEngine)的步驟全紀(jì)錄

    Python利用ORM控制MongoDB(MongoEngine)的步驟全紀(jì)錄

    MongoEngine是一個(gè)對象文檔映射器(ODM),相當(dāng)于一個(gè)基于SQL的對象關(guān)系映射器(ORM),下面這篇文章主要給大家介紹了關(guān)于Python利用ORM控制MongoDB(MongoEngine)的相關(guān)資料,需要的朋友可以參考下
    2018-09-09
  • python3利用Axes3D庫畫3D模型圖

    python3利用Axes3D庫畫3D模型圖

    這篇文章主要為大家詳細(xì)介紹了python3利用Axes3D庫畫3D模型圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Python簡單實(shí)現(xiàn)詞云圖代碼及步驟解析

    Python簡單實(shí)現(xiàn)詞云圖代碼及步驟解析

    這篇文章主要介紹了Python簡單實(shí)現(xiàn)詞云圖代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • python中itertools模塊使用小結(jié)

    python中itertools模塊使用小結(jié)

    itertools 是python的迭代器模塊,itertools提供的生成迭代器的函數(shù),相當(dāng)高效且節(jié)省內(nèi)存。使用這些工具,你將能夠創(chuàng)建自己定制的迭代器用于高效率的循環(huán)。接下來通過本文給大家介紹python中itertools模塊使用,感興趣的朋友一起看看吧
    2021-11-11
  • python中三種高階函數(shù)(map,reduce,filter)詳解

    python中三種高階函數(shù)(map,reduce,filter)詳解

    在Python中,函數(shù)其實(shí)也是一種數(shù)據(jù)類型,今天重點(diǎn)給大家介紹python中三種高階函數(shù)(map,reduce,filter)的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-10-10
  • django框架auth模塊用法實(shí)例詳解

    django框架auth模塊用法實(shí)例詳解

    這篇文章主要介紹了django框架auth模塊用法,結(jié)合實(shí)例形式詳細(xì)分析了Django框架auth模塊登錄驗(yàn)證、注銷等基本操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 在Python中處理字符串之isdigit()方法的使用

    在Python中處理字符串之isdigit()方法的使用

    這篇文章主要介紹了在Python中處理字符串之isdigit()方法的使用,是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05

最新評論

张掖市| 庆城县| 沧源| 沙坪坝区| 永昌县| 蕉岭县| 丰都县| 虞城县| 宣化县| 赤壁市| 吴江市| 景德镇市| 湾仔区| 调兵山市| 视频| 盐源县| 西宁市| 米泉市| 杨浦区| 桐乡市| 贵德县| 连云港市| 长泰县| 岑溪市| 永新县| 海伦市| 丰镇市| 永靖县| 漳浦县| 安仁县| 南汇区| 淅川县| 云和县| 台中县| 五莲县| 德惠市| 泰顺县| 浮山县| 元氏县| 尼玛县| 神农架林区|