絡(luò)輿情分析系統(tǒng)畢業(yè)設(shè)計(jì)全攻略:爬蟲、情感分析與可視化實(shí)現(xiàn))
簡介這是一套面向計(jì)算機(jī)、人工智能、通信及自動(dòng)化等專業(yè)學(xué)生的畢業(yè)設(shè)計(jì)級(jí)網(wǎng)絡(luò)輿情分析系統(tǒng)基于Python開發(fā)適用于課程設(shè)計(jì)、大作業(yè)及畢設(shè)參考兼顧小白入門與進(jìn)階二次開發(fā)需求。資源包共36個(gè)文件含13個(gè)核心Python源碼涵蓋數(shù)據(jù)采集、文本預(yù)處理、CNN/LSTM模型訓(xùn)練與情感評(píng)分、10個(gè)說明類txt文檔、2個(gè)系統(tǒng)界面截圖png/jpeg、2個(gè)詞向量文件.bz2及TensorFlow模型文件.pb、.index、.data輔以README.md和.gitignore等工程規(guī)范文件整體大小298.36MB結(jié)構(gòu)完整、模塊清晰。已有575人學(xué)習(xí)下載項(xiàng)目經(jīng)答辯評(píng)審獲98分高分所有代碼均通過本地調(diào)試與功能驗(yàn)證附帶詳細(xì)文檔說明覆蓋從環(huán)境配置、數(shù)據(jù)加載、模型訓(xùn)練到結(jié)果可視化全流程特別適合理解輿情分析中爬蟲對(duì)接、詞向量遷移、深度學(xué)習(xí)分類及結(jié)果解讀等關(guān)鍵環(huán)節(jié)。 每年三四月份總有人私信我學(xué)長網(wǎng)絡(luò)輿情分析系統(tǒng)這個(gè)題目怎么做今年更夸張?jiān)创a在網(wǎng)上流傳了一圈但真正能跑起來、能講清楚原理的沒幾個(gè)大部分卡在環(huán)境配置或者核心模塊不知道怎么寫更別說憋出一版能拿去答辯的論文。這篇文章就是給你通盤準(zhǔn)備的從系統(tǒng)怎么拆解、每個(gè)模塊怎么實(shí)現(xiàn)、數(shù)據(jù)庫怎么設(shè)計(jì)到論文目錄怎么排、答辯老師最愛問哪幾個(gè)問題一次講清楚。適合正在做畢業(yè)設(shè)計(jì)、或者想快速落地一個(gè)輿情分析項(xiàng)目的同學(xué)參考代碼方案是完整可復(fù)現(xiàn)的。1. 項(xiàng)目概述與核心拆解1.1 系統(tǒng)定位與功能范圍先說清楚這個(gè)系統(tǒng)到底是個(gè)什么東西。網(wǎng)絡(luò)輿情分析系統(tǒng)本質(zhì)上是把互聯(lián)網(wǎng)上散落的公開文本數(shù)據(jù)新聞標(biāo)題、評(píng)論區(qū)、微博帖子、貼吧發(fā)言等抓下來經(jīng)過清洗、分詞、情感判別、主題聚類等處理最終通過可視化頁面把輿論走向、情感傾向、熱點(diǎn)話題呈現(xiàn)出來。畢設(shè)級(jí)別的系統(tǒng)不需要做到商業(yè)軟件的復(fù)雜程度但功能鏈路得完整。我最終交付的系統(tǒng)包含五個(gè)核心功能模塊數(shù)據(jù)采集模塊抓取新聞評(píng)論和微博搜索頁的公開文本數(shù)據(jù)數(shù)據(jù)清洗與分詞模塊去噪、去重復(fù)、中文分詞、去停用詞情感分析模塊對(duì)每條文本輸出正面/中性/負(fù)面標(biāo)簽并計(jì)算情感得分熱點(diǎn)話題檢測(cè)模塊按時(shí)間窗口聚合關(guān)鍵詞識(shí)別突發(fā)話題和負(fù)面預(yù)警可視化展示模塊趨勢(shì)折線圖、情感占比餅圖、熱詞詞云、負(fù)面預(yù)警列表這套功能閉環(huán)走下來前端展示、后端接口、數(shù)據(jù)庫設(shè)計(jì)、算法實(shí)現(xiàn)全都有了工作量足夠支撐一篇完整的畢設(shè)論文也方便你在答辯時(shí)按模塊逐個(gè)講清楚。1.2 技術(shù)選型與選型理由很多同學(xué)一上來就問用Django還是Flask。我的答案是畢設(shè)項(xiàng)目用Flask就夠了除非你的導(dǎo)師明確要求用Django。理由很簡單。Flask輕量、靈活一個(gè)app.py文件就能把路由和接口串起來對(duì)單人開發(fā)非常友好。Django自帶Admin后臺(tái)、ORM、中間件體系功能強(qiáng)大但對(duì)于輿情分析這種以算法處理為核心的場(chǎng)景大量邏輯集中在數(shù)據(jù)清洗和分析層Web框架只是外殼用Django反而顯得笨重。我見過不少同學(xué)因?yàn)镈jango的遷移機(jī)制和配置項(xiàng)折騰好幾天最后連表都沒建明白。其他關(guān)鍵組件選型也一并說清楚模塊選型理由開發(fā)語言Python 3.9中文NLP生態(tài)成熟jieba、SnowNLP、sklearn直接可用Web框架Flask 2.x輕量、易調(diào)試、接口開發(fā)效率高數(shù)據(jù)庫MySQL 5.7 / 8.0數(shù)據(jù)關(guān)系清晰論文里寫出來也專業(yè)爬蟲requests BeautifulSoup畢設(shè)數(shù)據(jù)量級(jí)用不到Scrapy自己控制請(qǐng)求邏輯更靈活分詞jieba中文分詞首選支持自定義詞典情感分析SnowNLP 自建LR模型先做基線再訓(xùn)練自己的模型做對(duì)比可視化PyECharts直接生成HTML圖表嵌入前端頁面方便前端Bootstrap ECharts Jinja2模板不用前后端分離減少聯(lián)調(diào)成本1.3 系統(tǒng)整體架構(gòu)系統(tǒng)的數(shù)據(jù)流是單向的采集層 - 清洗層 - 分析層 - 存儲(chǔ)層 - 展示層。每層只依賴下一層方便單獨(dú)測(cè)試和替換。采集層定時(shí)抓取數(shù)據(jù)寫入本地臨時(shí)文件或直接入庫。清洗層從庫里讀出原始文本完成去HTML標(biāo)簽、去空白、去停用詞、分詞把結(jié)果寫回或存到新表。分析層讀取清洗后的數(shù)據(jù)做情感打分和主題聚類產(chǎn)出結(jié)構(gòu)化結(jié)果表。展示層通過Flask路由把結(jié)果以JSON形式傳給前端前端用ECharts渲染圖表。這個(gè)分層設(shè)計(jì)不僅在實(shí)現(xiàn)時(shí)思路清晰寫論文時(shí)也天然對(duì)應(yīng)系統(tǒng)設(shè)計(jì)章節(jié)的架構(gòu)圖。你不需要額外發(fā)明架構(gòu)按這個(gè)分層畫數(shù)據(jù)流圖就夠用了。提示如果導(dǎo)師要求使用前后端分離也可以不改邏輯層只把Flask的render_template換成RESTful API前端用Vue或原生HTML調(diào)用即可分析模塊完全復(fù)用。2. 關(guān)鍵模塊設(shè)計(jì)與實(shí)現(xiàn)2.1 數(shù)據(jù)采集層從零寫一個(gè)可用的爬蟲數(shù)據(jù)采集是最容易翻車的環(huán)節(jié)。很多同學(xué)一上來就選微博或者抖音結(jié)果反爬機(jī)制太強(qiáng)三天抓不到一條數(shù)據(jù)心態(tài)直接崩了。我的建議是起步階段選一個(gè)接口相對(duì)寬松的新聞門戶網(wǎng)站比如網(wǎng)易新聞、新浪新聞的科技頻道評(píng)論區(qū)這些地方的公開數(shù)據(jù)足夠你做分析而且請(qǐng)求頻率控制得當(dāng)基本不會(huì)觸發(fā)反爬。我選的方案是爬取某新聞門戶科技頻道的文章列表再逐篇獲取文章下的評(píng)論。這里有個(gè)小技巧很多新聞網(wǎng)站的評(píng)論數(shù)據(jù)不是直接渲染在HTML里的而是通過一個(gè)JSON接口異步加載。打開瀏覽器開發(fā)者工具切到Network面板刷新評(píng)論區(qū)找到返回JSON數(shù)據(jù)的XHR請(qǐng)求那個(gè)就是評(píng)論接口。爬蟲代碼的核心邏輯大概是這樣import requests import json import time import random def fetch_comments(article_id, page1): url fhttps://example.com/api/comment/list?article_id{article_id}page{page} headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36, Referer: fhttps://example.com/article/{article_id}.html } resp requests.get(url, headersheaders, timeout10) if resp.status_code 200: data resp.json() return data.get(comments, []) return []注意幾個(gè)細(xì)節(jié)。第一請(qǐng)求頭里的Referer一定要帶很多接口會(huì)校驗(yàn)來源頁面。第二每次請(qǐng)求之間加一個(gè)隨機(jī)延時(shí)我用的是time.sleep(random.uniform(1, 2))既不會(huì)太慢也能降低被封風(fēng)險(xiǎn)。第三超時(shí)時(shí)間必須設(shè)置否則某個(gè)請(qǐng)求卡住整個(gè)爬蟲就死在那里。有的網(wǎng)站評(píng)論區(qū)需要登錄才能查看這種直接放棄換一個(gè)數(shù)據(jù)源即可。畢設(shè)階段不碰需要破解驗(yàn)證碼或繞過登錄的站點(diǎn)這是合規(guī)底線也是碩士階段繼續(xù)做研究時(shí)應(yīng)該遵守的通行準(zhǔn)則。注意只采集公開可訪問的數(shù)據(jù)限制請(qǐng)求頻率不繞過任何訪問控制機(jī)制用于學(xué)術(shù)研究。這段話建議寫進(jìn)論文的合規(guī)說明章節(jié)答辯時(shí)老師會(huì)認(rèn)可。2.2 文本清洗與分詞決定了分析效果的上限爬下來的數(shù)據(jù)不能直接用里面全是噪音。HTML實(shí)體、空格、表情符號(hào)、用戶名、URL鏈接這些東西對(duì)情感分析沒有任何幫助反而會(huì)干擾模型。我寫了一個(gè)統(tǒng)一的clean_text函數(shù)按順序處理import re import jieba def clean_text(text): # 去掉HTML標(biāo)簽和實(shí)體 text re.sub(r[^], , text) text re.sub(r[a-zA-Z];, , text) # 去掉URL和用戶名 text re.sub(rhttps?://\S, , text) text re.sub(r\w, , text) # 去掉多余空白和特殊符號(hào) text re.sub(r[\s\.\!\/_,$%^*(\\)], , text) return text.strip() def segment(text): return jieba.lcut(clean_text(text))這里要重點(diǎn)說一個(gè)坑jieba默認(rèn)詞典對(duì)網(wǎng)絡(luò)新詞和領(lǐng)域?qū)I(yè)詞的識(shí)別很差。比如“絕絕子”“YYDS”這類詞默認(rèn)詞庫根本不認(rèn)識(shí)會(huì)被切得亂七八糟。解決辦法是維護(hù)一個(gè)自定義詞典每一行一個(gè)詞加上詞頻和詞性然后在分詞前加載jieba.load_userdict(user_dict.txt) # user_dict.txt 內(nèi)容示例 # 絕絕子 100 nz # 無語子 100 nz # 破防 80 v我建議你從網(wǎng)上搜集100到200個(gè)當(dāng)時(shí)的網(wǎng)絡(luò)熱詞加入詞典這對(duì)后續(xù)情感分析和關(guān)鍵詞提取的準(zhǔn)確率有明顯的提升。在論文的實(shí)驗(yàn)章節(jié)可以對(duì)比加詞典前后的分詞效果這也是一個(gè)很好的工作量和思路展示點(diǎn)。2.3 情感分析從規(guī)則到模型的三級(jí)跳情感分析是整個(gè)系統(tǒng)的核心也是答辯時(shí)老師最可能深挖的部分。我把它拆成三個(gè)層次來介紹你根據(jù)自己能力選擇實(shí)現(xiàn)到哪一層但建議至少做到第二層。第一層是情感詞典法。用現(xiàn)成的BosonNLP情感詞典或者知網(wǎng)情感詞典統(tǒng)計(jì)文本中正面詞和負(fù)面詞的個(gè)數(shù)再考慮程度副詞和否定詞。比如“非常開心”得分會(huì)高于“開心”“不快樂”會(huì)把情緒反轉(zhuǎn)。純?cè)~典方法實(shí)現(xiàn)簡單但準(zhǔn)確率比較低尤其對(duì)反諷和口語化表達(dá)基本無能為力。第二層是SnowNLP基線模型。SnowNLP自帶了一個(gè)基于樸素貝葉斯的情感分類器調(diào)用方式非常簡潔from snownlp import SnowNLP text 新產(chǎn)品體驗(yàn)太差了頻繁閃退用戶體驗(yàn)極差 s SnowNLP(text) print(s.sentiments) # 輸出0到1之間的情感得分越接近0越負(fù)面SnowNLP的默認(rèn)模型是在電商評(píng)論語料上訓(xùn)練的遷移到輿情場(chǎng)景后準(zhǔn)確率一般在60%上下會(huì)系統(tǒng)性偏向某一種情感。所以它更適合做基線參考不能直接拿來當(dāng)最終方案。第三層是自建機(jī)器學(xué)習(xí)模型。我標(biāo)注了約2000條評(píng)論數(shù)據(jù)正面、負(fù)面、中性各占一部分然后用jieba分詞 TF-IDF向量化喂給邏輯回歸模型訓(xùn)練。核心代碼如下from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import LogisticRegression from sklearn.model_selection import train_test_split vectorizer TfidfVectorizer(max_features8000) X vectorizer.fit_transform(train_texts) y train_labels X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) model LogisticRegression(max_iter2000) model.fit(X_train, y_train) print(準(zhǔn)確率:, model.score(X_test, y_test))實(shí)測(cè)下來邏輯回歸模型的準(zhǔn)確率能到85%左右比SnowNLP高出20多個(gè)百分點(diǎn)。這個(gè)對(duì)比實(shí)驗(yàn)本身就是論文里很有分量的一個(gè)小節(jié)。做標(biāo)注的時(shí)候要快一點(diǎn)不要追求完美大約2000條就夠了要求是三個(gè)類別盡量均衡。真正的殺手锏是文本長度差異短文本容易分類出錯(cuò)建議把少于10個(gè)字符的評(píng)論單獨(dú)歸為中性或直接丟棄。提示不要一開始就上BERT這類深度學(xué)習(xí)模型。對(duì)畢設(shè)而言數(shù)據(jù)量太小撐不起神經(jīng)網(wǎng)絡(luò)訓(xùn)練邏輯回歸已經(jīng)足夠出彩而且解釋起來容易答辯時(shí)老師問“為什么選這個(gè)模型”你回答“在高維稀疏文本特征下線性模型有足夠強(qiáng)的判別力”就很有說服力了。2.4 熱點(diǎn)話題檢測(cè)用K-Means聚類找輿論焦點(diǎn)熱點(diǎn)話題檢測(cè)我采用的是TF-IDF K-Means聚類的經(jīng)典組合。具體流程是對(duì)清洗后的評(píng)論按天合并提取關(guān)鍵詞用的是jieba.analyse.extract_tags把每天的關(guān)鍵詞映射為TF-IDF向量然后用K-Means聚類把相似話題歸為一組每組取特征詞作為話題標(biāo)簽。K-Means有一個(gè)繞不開的問題K值怎么定。我用了肘部法則就是在不同K值下計(jì)算簇內(nèi)誤差平方和SSE畫折線圖找下降趨勢(shì)變緩的拐點(diǎn)。當(dāng)時(shí)測(cè)試的結(jié)果是K8到12之間比較合適我最終選了K10。熱點(diǎn)檢測(cè)還需要一個(gè)突發(fā)度指標(biāo)。我的做法是統(tǒng)計(jì)每個(gè)話題在當(dāng)天的評(píng)論量對(duì)比前3天的平均評(píng)論量計(jì)算增長率。增長率超過閾值就判定為熱點(diǎn)話題。閾值我設(shè)為200%也就是當(dāng)天的關(guān)注度是日常的3倍以上就會(huì)觸發(fā)熱點(diǎn)標(biāo)記。這個(gè)閾值不是隨便拍的我是跑了一周數(shù)據(jù)觀察正常波動(dòng)水平之后定的。負(fù)面預(yù)警的邏輯類似。如果某個(gè)話題的情感得分均值低于0.35且評(píng)論量超過當(dāng)天所有話題的評(píng)論量均值就會(huì)在預(yù)警列表中置頂。2.5 可視化模塊把分析結(jié)果變成能看的圖可視化我用了PyECharts。這里要提醒一點(diǎn)PyECharts有很多版本我用的是2.x版本對(duì)應(yīng)echarts 5.x寫法跟1.x版本差異較大。用的時(shí)候一定要確認(rèn)版本否則看到的報(bào)錯(cuò)全是版本不匹配。我做的圖表有四個(gè)按天統(tǒng)計(jì)的輿情趨勢(shì)折線圖、情感占比餅圖、熱詞詞云和負(fù)面話題排名柱狀圖。PyECharts生成圖表的方式是輸出一個(gè)HTML片段在Flask模板里用iframe嵌入或直接拼接。核心代碼from pyecharts.charts import Line from pyecharts import options as opts def make_trend_chart(dates, counts): line ( Line() .add_xaxis(dates) .add_yaxis(輿情數(shù)量, counts) .set_global_opts( title_optsopts.TitleOpts(title輿情趨勢(shì)), xaxis_optsopts.AxisOpts(name日期), yaxis_optsopts.AxisOpts(name數(shù)量), ) ) return line.render_embed()render_embed()會(huì)返回一段完整的HTML代碼直接插到Jinja2模板里就行。注意中文字體問題ECharts默認(rèn)的字體在部分Linux服務(wù)器上會(huì)顯示成方塊需要在set_global_opts里加上font_family: Microsoft YaHei, SimHei。3. 數(shù)據(jù)庫設(shè)計(jì)與系統(tǒng)部署3.1 數(shù)據(jù)庫表結(jié)構(gòu)五張表就能撐起整個(gè)系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)不要過度設(shè)計(jì)五張表足夠了。這是我從一開始就堅(jiān)持的原則因?yàn)槊恳粡埍矶家谡撐睦锂婨R圖、寫字段說明表太多最后反而是自己給自己挖坑。第一張表是新聞表存儲(chǔ)抓取到的文章信息字段包括新聞ID、標(biāo)題、來源、URL、發(fā)布時(shí)間。第二張表是評(píng)論表存儲(chǔ)清洗前的原始評(píng)論和清洗后的文本字段包括評(píng)論ID、新聞ID、評(píng)論內(nèi)容、清洗后內(nèi)容、情感得分、情感標(biāo)簽。第三張表是關(guān)鍵詞統(tǒng)計(jì)表按天存儲(chǔ)每個(gè)關(guān)鍵詞的出現(xiàn)頻次。第四張表是熱點(diǎn)話題表存儲(chǔ)聚類得到的話題名、關(guān)鍵詞、首次出現(xiàn)時(shí)間、評(píng)論量、負(fù)面占比。第五張表是系統(tǒng)日志表記錄爬蟲運(yùn)行狀態(tài)和錯(cuò)誤信息。MySQL建表時(shí)需要注意一個(gè)關(guān)鍵問題字符集必須設(shè)置為utf8mb4而不是utf8。原因是MySQL的utf8字符集最多支持3字節(jié)存不了4字節(jié)的emoji表情新聞評(píng)論里表情很常見不設(shè)utf8mb4插入時(shí)會(huì)直接報(bào)錯(cuò)。我當(dāng)時(shí)第一次建庫用的utf8插了200條數(shù)據(jù)就報(bào)錯(cuò)了改成utf8mb4之后才算穩(wěn)定。主鍵索引必須建。評(píng)論表按照新聞ID建普通索引因?yàn)榻y(tǒng)計(jì)聚合基本都是按新聞維度做的。關(guān)鍵詞統(tǒng)計(jì)表按日期建索引熱詞查詢都是按天過濾。3.2 部署步驟與依賴清單我把部署步驟整理成了一份可以直接按順序執(zhí)行的清單你在Windows本機(jī)或者Linux服務(wù)器上操作都適用。第一步安裝Python 3.9及以上版本用conda創(chuàng)建獨(dú)立虛擬環(huán)境避免和系統(tǒng)Python環(huán)境沖突。第二步安裝依賴包我把requirements.txt列在這里flask2.2.5 requests2.31.0 beautifulsoup44.12.2 jieba0.42.1 snownlp0.12.3 pandas2.0.3 pymysql1.1.0 scikit-learn1.3.0 pyecharts2.0.3第三步在MySQL里建庫執(zhí)行SQL腳本創(chuàng)建五張表。第四步配置數(shù)據(jù)庫連接。我第五步啟動(dòng)爬蟲任務(wù)抓取數(shù)據(jù)第六步啟動(dòng)Flask應(yīng)用python app.py然后瀏覽器訪問 http://127.0.0.1:5000 就能看到系統(tǒng)首頁。數(shù)據(jù)量正常的話整個(gè)流程半小時(shí)內(nèi)可以跑通。3.3 Flask應(yīng)用的核心路由實(shí)現(xiàn)Flask后端不需要寫太多路由核心就三個(gè)首頁路由、數(shù)據(jù)統(tǒng)計(jì)接口、爬蟲觸發(fā)接口。首頁路由用render_template渲染前端頁面把圖表HTML嵌入進(jìn)去。數(shù)據(jù)統(tǒng)計(jì)接口返回JSON數(shù)據(jù)給前端圖表比如返回某時(shí)間段內(nèi)每天的輿情數(shù)量、情感占比等。爬蟲觸發(fā)接口在后臺(tái)啟動(dòng)爬取任務(wù)并把運(yùn)行狀態(tài)寫入日志表。4. 畢業(yè)設(shè)計(jì)文檔組織與答辯準(zhǔn)備4.1 論文目錄編排建議這套系統(tǒng)的論文結(jié)構(gòu)我建議按七章來組織第一章緒論寫研究背景、國內(nèi)外研究現(xiàn)狀、研究內(nèi)容與技術(shù)路線其中技術(shù)路線圖直接套用前面說的分層架構(gòu)第二章相關(guān)技術(shù)介紹把Python、Flask、jieba、機(jī)器學(xué)習(xí)模型等逐個(gè)介紹這部分篇幅容易湊但別寫成API文檔說明書每項(xiàng)技術(shù)寫清楚為什么選它第三章系統(tǒng)需求分析畫用例圖分析功能性需求和非功能性需求第四章系統(tǒng)設(shè)計(jì)包括總體架構(gòu)設(shè)計(jì)、功能模塊設(shè)計(jì)、數(shù)據(jù)庫設(shè)計(jì)這是論文的核心章節(jié)第五章系統(tǒng)實(shí)現(xiàn)按模塊展示核心代碼和截圖第六章系統(tǒng)測(cè)試寫測(cè)試用例表和測(cè)試結(jié)果第七章總結(jié)與展望寫完成的工作、存在的不足和下一步方向4.2 測(cè)試用例怎么設(shè)計(jì)測(cè)試章節(jié)最忌諱寫成“系統(tǒng)運(yùn)行正常功能完善”。要設(shè)計(jì)具體的測(cè)試用例和預(yù)期結(jié)果。我列一個(gè)可用指標(biāo)數(shù)據(jù)采集成功率清洗后數(shù)據(jù)有效率情感分析準(zhǔn)確率對(duì)比模型和SnowNLP聚類結(jié)果合理性人工判斷頁面響應(yīng)時(shí)間統(tǒng)計(jì)接口控制在200ms內(nèi)。每一項(xiàng)都要有數(shù)據(jù)支撐答辯時(shí)你可以直接說“情感分析準(zhǔn)確率85%比基線模型提升約25個(gè)百分點(diǎn)”這比任何形容詞都有說服力。4.3 答辯常見問題預(yù)演答辯老師最常問的幾個(gè)問題我提前幫你預(yù)演一遍。第一個(gè)問題為什么要做網(wǎng)絡(luò)輿情分析系統(tǒng)回答思路是一方面輿情監(jiān)測(cè)在政務(wù)、企業(yè)公關(guān)領(lǐng)域有實(shí)際需求另一方面這個(gè)項(xiàng)目綜合運(yùn)用了爬蟲、自然語言處理、機(jī)器學(xué)習(xí)和可視化技術(shù)是一個(gè)很好的工程實(shí)踐。第二個(gè)問題情感分析的原理是什么回答時(shí)要說清楚從文本到向量再到分類器的完整鏈路重點(diǎn)講TF-IDF如何把文本轉(zhuǎn)化為數(shù)值特征邏輯回歸如何做分類決策。第三個(gè)問題系統(tǒng)存在哪些不足這個(gè)問題不要回避主動(dòng)說出兩點(diǎn)改進(jìn)方向一是標(biāo)注數(shù)據(jù)量偏少模型泛化能力受限二是輿情預(yù)警的時(shí)效性還不夠未來可以引入流式計(jì)算框架。第四個(gè)問題爬蟲數(shù)據(jù)是否合規(guī)答案是只采集公開數(shù)據(jù)、控制請(qǐng)求頻率、不繞過反爬機(jī)制、僅用于學(xué)術(shù)研究。合規(guī)性是畢業(yè)論文的硬指標(biāo)主動(dòng)講清楚反而加分。5. 踩坑記錄與性能優(yōu)化5.1 常見問題速查表我整理了開發(fā)調(diào)試階段遇到頻率最高的幾個(gè)問題每一道都是真實(shí)踩過坑的。問題現(xiàn)象解決方案MySQL插入emoji報(bào)錯(cuò)Incorrect string value建庫時(shí)指定utf8mb4字符集SnowNLP情感得分偏向0.5結(jié)果都集中在0.4~0.6用自建LR模型替代或?qū)Φ梅肿鰧?duì)數(shù)變換后再閾值判定爬蟲請(qǐng)求被拒絕返回403或跳轉(zhuǎn)驗(yàn)證頁加Referer、隨機(jī)UA降低請(qǐng)求頻率ECharts中文亂碼圖表標(biāo)題顯示方塊指定font_family為Microsoft YaHeiPyECharts版本差異render_embed方法找不到統(tǒng)一用2.0.x版本檢查導(dǎo)入路徑聚類結(jié)果不穩(wěn)定每次跑K-Means結(jié)果不同設(shè)置random_state固定隨機(jī)種子Flask頁面加載慢圖表渲染卡頓把圖表數(shù)據(jù)用接口異步加載首屏先渲染框架5.2 性能優(yōu)化與并發(fā)控制畢設(shè)數(shù)據(jù)量在幾萬條級(jí)別單線程爬蟲雖然能跑但速度確實(shí)慢。優(yōu)化方案有兩個(gè)層次簡單層次是給爬蟲加多線程我用ThreadPoolExecutor開4個(gè)線程配合一個(gè)線程安全的隊(duì)列來分發(fā)任務(wù)數(shù)據(jù)采集速度提升了三倍左右。進(jìn)階層次是把requests換成異步框架tornado或httpx的async模式但畢設(shè)階段用多線程就夠了。數(shù)據(jù)寫入也要優(yōu)化。逐條INSERT在數(shù)據(jù)量大的時(shí)候會(huì)非常慢我改成批量插入每次攢夠100條執(zhí)行一次executemany耗時(shí)能下降一個(gè)數(shù)量級(jí)。5.3 功能擴(kuò)展方向如果這個(gè)項(xiàng)目做完還有余力或者想讓系統(tǒng)更有亮點(diǎn)我建議往兩個(gè)方向擴(kuò)展。一個(gè)是引入大模型做觀點(diǎn)摘要用開源模型對(duì)每個(gè)熱點(diǎn)話題下的評(píng)論生成一段總結(jié)性文字這在展示效果上非常驚艷。另一個(gè)是自動(dòng)生成輿情報(bào)告把統(tǒng)計(jì)數(shù)據(jù)、情感變化、熱點(diǎn)事件整理成結(jié)構(gòu)化文檔一鍵導(dǎo)出這在實(shí)際業(yè)務(wù)場(chǎng)景中非常實(shí)用。這兩個(gè)擴(kuò)展方向不需要完整實(shí)現(xiàn)只需要在論文的展望部分寫清楚思路或者做一個(gè)小demo答辯時(shí)就是加分項(xiàng)。做完這個(gè)項(xiàng)目我最大的體會(huì)是畢設(shè)不是追求技術(shù)多高深而是把你做過的事情本文還有配套的精品資源點(diǎn)擊獲取