# 專題:成功大學Dcard板塊的社群互動與心理健康相關性研究
Dcard是台灣最大的匿名社交平台之一,其中「成功大學」板塊作為該校學生和校友的主要交流平台,提供了豐富的資料來源。這些資料不僅反映了學生的日常生活、學術問題,還涉及到更為複雜的心理健康問題。
#### 研究目的
本研究旨在探討「成功大學」Dcard板塊中的社群互動與心理健康的相關性。透過對大量文章和回應的分析,我們希望能夠:
瞭解成功大學學生在Dcard上的主要關注點和行為模式。
探究社群互動與心理健康狀態之間的相關性。
為學校提供改善學生心理健康的具體建議。
#### 研究方法
- 資料收集:使用Selenium和Pandas進行網頁爬蟲和資料清洗。
- 資料分析:使用自然語言處理(NLP)技術和機器學習模型進行文本分析。
- 結果評估:透過統計分析和質性研究,評估研究假設的有效性。
#### 預期成果
研究將揭示成功大學Dcard板塊中最常見的主題和問題。
提供一個量化的模型,用於評估社群互動與心理健康之間的相關性。
為學校和相關機構提供實用的建議,以改善學生的心理健康狀態。
#### 關鍵詞
Dcard, 成功大學, 社群互動, 心理健康
補充資源:
- [Dcard資料搜集](https://drive.google.com/file/d/1NgbQJ5LMlmcN-WF1G6AZeGsQgs1mkqdh/view?usp=share_link)
- [Selenium使用](https://drive.google.com/file/d/1NNnYzAu3MXF-ldLjeNxWEYrWc6vFZb6v/view?usp=share_link)
## 資料處理流程
在這個部分,我們將詳細解釋資料清洗和處理的流程,並提供相應的程式碼示例。
### 1. 資料收集
首先,我們使用Selenium來爬取「成功大學」Dcard板塊的文章和回應。
```python
from selenium import webdriver
# 初始化webdriver
browser = webdriver.Chrome()
# 訪問Dcard成功大學板塊
browser.get('https://www.dcard.tw/f/ncku')
```
考慮到我們的研究目標和方法,我們可以使用Selenium來模擬瀏覽器操作,進行自動化的文章查詢和篩選。具體來說,我們可以:
進入成功大學的Dcard校板:成功大學校板
使用Selenium的find_element_by_css_selector或find_element_by_xpath方法來定位文章標題、文本、點閱數、愛心數、留言數、留言內容和標籤等。
使用click()方法來模擬點擊操作,如翻頁或進入文章。
```python
from selenium import webdriver
# 啟動瀏覽器並訪問網站
browser = webdriver.Chrome()
browser.get('https://www.dcard.tw/f/ncku')
# 定位元素並操作
article_title = browser.find_element_by_css_selector('.ArticleTitle_selector')
article_title.click()
```
### 2. 資料分類與儲存
蒐集到的資料可以存儲在一個或多個CSV或JSON文件中,以便後續分析。我們可以按照以下方式進行分類和儲存:
標題、文本、點閱數、愛心數、留言數可以存儲在一個主CSV文件中。
留言內容可以存儲在一個獨立的CSV文件中。
標籤可以作為主CSV文件的一個欄位,或存儲在一個獨立的CSV文件中。
### 3. 資料清洗
使用Pandas庫,我們可以進行以下資料清洗步驟:
去除空值:使用dropna()方法去除含有空值的行或列。
去除重複值:使用drop_duplicates()方法去除重複的行。
轉換數據類型:使用astype()方法轉換數據類型,如將點閱數和愛心數轉換為整數。
文本清洗:使用正則表達式或自定義函數去除或替換不需要的字符。
```python
import pandas as pd
df = pd.read_csv('data.csv')
df.dropna(inplace=True)
df.drop_duplicates(inplace=True)
df['views'] = df['views'].astype(int)
df['text'] = df['text'].str.replace('[^a-zA-Z0-9]', ' ')
```
這樣的資料清洗流程可以有效地將原始數據轉換為適合分析的格式。
#### 3.1 NLP資料清洗
在進行自然語言處理(NLP)之前,資料清洗是一個關鍵步驟。這通常包括以下幾個方面:
文本正規化
將文本轉換為一個標準格式。例如,將所有字母轉換為小寫,去除標點符號等。
```py
# 文本正規化
normalized_text = raw_text.lower().replace('.', '').replace(',', '')
```
> 斷詞(Tokenization):
> 將文本分解為更小的片段或「詞」
#### 3.2 Dcard文本分析流程
由於我們的研究對象是Dcard上的「成功大學」板塊,這個板塊有其特殊性,包括主要使用中文、豐富的顏文字和表情符號,以及動態的社交互動指標(如愛心數、留言和點閱率)。以下是一個更詳細的文本分析流程,包括對應的程式碼。
**1. 中文斷詞**
首先,我們使用jieba進行中文斷詞。
```python
import jieba
# 斷詞
seg_list = jieba.cut('你的文本', cut_all=False)
words = ' '.join(seg_list)
```
**2. 顏文字和表情符號**
這些符號在Dcard上非常常見,並且可能對某些分析(如情感分析)有重要意義。
```python
import re
# 去除或保留顏文字和表情符號
emoji_pattern = re.compile('['u'\U0001F600-\U0001F64F'u'\U0001F300-\U0001F5FF'u'\U0001F680-\U0001F6FF'u'\U0001F700-\U0001F77F'u'\U0001F780-\U0001F7FF'u'\U0001F800-\U0001F8FF'u'\U0001F900-\U0001F9FF'u'\U0001FA00-\U0001FA6F'u'\U0001FA70-\U0001FAFF'u'\U00002702-\U000027B0'u'\U00002600-\U000026FF']+')
filtered_text = emoji_pattern.sub(r'', text)
```
**3. 社交互動指標**
愛心數、留言和點閱率是文章受歡迎程度的重要指標。
```python
# 假設這些數據已經被爬取並存儲在DataFrame中
import pandas as pd
df = pd.DataFrame({'title': titles, 'hearts': hearts, 'comments': comments, 'views': views})
```
**4. 情感分析**
使用中文情感分析工具,如SnowNLP。
```python
from snownlp import SnowNLP
# 情感分析
s = SnowNLP(text)
s.sentiments
```
**5. 主題模型**
使用LDA來找出成功大學板塊中最常出現的主題。
```py
from sklearn.decomposition import LatentDirichletAllocation as LDA
# 執行LDA模型
lda = LDA(n_components=5)
lda.fit_transform(X)
from nltk.tokenize import word_tokenize
tokens = word_tokenize(normalized_text)
```
**6. 停用詞去除**
去除常見但對分析沒有太多意義的詞,如 'the', 'is', 'in' 等。
```python
from nltk.corpus import stopwords
stop_words = set(stopwords.words('english'))
filtered_tokens = [w for w in tokens if not w in stop_words]
```
**7. 詞幹提取(Stemming)**
將詞的不同形式還原為其詞幹。例如,'running' -> 'run'。
```python
from nltk.stem import PorterStemmer
ps = PorterStemmer()
stemmed_tokens = [ps.stem(w) for w in filtered_tokens]
```
這些步驟將為後續的NLP分析提供一個乾淨、結構化的資料集。
```python
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
X = cv.fit_transform(df['text'])
```
### 4. 統計分析
進行統計分析以評估研究假設的有效性,以下以t-test作範例:
```python
from scipy import stats
# t-test
stats.ttest_ind(group1, group2)
```