社交媒体洞察与图挖掘:从推文分类到账号推荐
立即解锁
发布时间: 2025-08-21 01:07:22 阅读量: 2 订阅数: 5 


Python数据挖掘实战指南
### 社交媒体洞察与图挖掘:从推文分类到账号推荐
#### 1. 推文文本挖掘与分类
在处理推文数据时,我们的目标是判断一条提及“python”的推文是否是在讨论编程语言。以下是具体的实现步骤:
- **特征提取**:
- 首先,我们定义了一个`NLTKBOW`类,用于将推文文本转换为词袋表示。代码如下:
```python
from sklearn.base import TransformerMixin
from nltk import word_tokenize
class NLTKBOW(TransformerMixin):
def fit(self, X, y=None):
return self
def transform(self, X):
return [{word: True for word in word_tokenize(document)}
for document in X]
```
- 这个类的`transform`方法会将每条推文拆分成单词,并以字典的形式表示,字典的键是单词,值为`True`表示该单词在推文中出现过。
- **字典转换为矩阵**:
- 使用`DictVectorizer`将词袋字典转换为矩阵,以便后续的分类器使用。代码如下:
```python
from sklearn.feature_extraction import DictVectorizer
```
- **训练朴素贝叶斯分类器**:
- 由于我们的数据集只有二元特征,所以使用`BernoulliNB`分类器。代码如下:
```python
from sklearn.naive_bayes import BernoulliNB
```
- **构建管道**:
- 将上述组件组合成一个管道,代码如下:
```python
from sklearn.pipeline import Pipeline
pipeline = Pipeline([('bag-of-words', NLTKBOW()),
('vectorizer', DictVectorizer()),
('naive-bayes', BernoulliNB())
])
```
- **加载数据**:
- 加载推文数据和对应的标签,代码如下:
```python
import os
import json
input_filename = os.path.join(os.path.expanduser("~"), "Data", "twitter", "python_tweets.json")
labels_filename = os.path.join(os.path.expanduser("~"), "Data", "twitter", "python_classes.json")
tweets = []
with open(input_filename) as inf:
for line in inf:
if len(line.strip()) == 0:
continue
tweets.append(json.loads(line)['text'])
with open(labels_filename) as inf:
labels = json.load(inf)
```
- **评估模型**:
- 使用F1分数作为评估指标,因为在类别样本数量不均衡的情况下,准确率可能不是一个合适的评估指标。代码如下:
```python
from sklearn.model_selection import cross_val_score
import numpy as np
scores = cross_val_score(pipeline, tweets, labels, scoring='f1')
print("Score: {:.3f}".format(np.mean(scores)))
```
- 运行结果显示,在只有200条推文的数据集上,我们可以大约80%的准确率判断一条推文是否与Python编程语言相关。
- **提取有用特征**:
- 为了找出对判断推文相关性最有用的特征,我们可以从训练好的模型中提取特征概率。代码如下:
```python
model = pipeline.fit(tweets, labels)
nb = model.named_steps['naive-bayes']
feature_probabilities = nb.feature_log_prob_
top_features = np.argsort(-feature_probabilities[1])[:50]
dv = model.named_steps['vectorizer']
for i, feature_index in enumerate(top_features):
print(i, dv.feature_names_[feature_index],
np.exp(feature_probabilities[1][feature_i
```
0
0
复制全文
相关推荐









