最近在家找工作空闲时间比较多,刚好朋友最近一直在吐槽相亲的事情,就爬了下豆瓣相亲小组8月份发的贴子看看。
思路就是结巴分词看看大家说的最多的是什么,男女发帖情况,回应数,年龄分布
数据来源
后裔采集器自动采集(我才不会说爬虫学习曲线过分陡峭,太麻烦了。。。呢)
一共1165个记录。
数据处理
#导包
import jieba
import pandas as pd
import re
import collections
#读数据
df = pd.read_csv('C:/Users/Jasmine/Desktop/Learning/相亲数据集.csv',engine='python')
# 删除发帖内容为空的
df.drop(df[df['发帖内容'].isnull()].index,inplace=True)
# 把发帖内容的类型转为字符串,方便后续分词和政策匹配
df['发帖内容'] = df['发帖内容'].astype('str')
# 模式串,只保留中英文和数字
patten = r"[^\u4e00-\u9fa5^a-z^A-Z^0-9]"
#将匹配模式串进行编译
re_obj = re.compile(patten)
def clear(text):
return re_obj.sub('', text)
df['发帖内容'] = df['发帖内容'].apply(clear)
# 用jieba分词对每一个帖子进行分词处理
def cut_words(words):
return jieba.lcut(words)
df['发帖内容'] = df['发帖内容'].apply(cut_words)
#读取停用词列表
stop_list = [
i.strip() for i in open(r'C:\Users\Jasmine\stopwords_zh.txt',encoding='gbk').readlines()
]
#移除停用词函数
def remove_stop(words):
texts = []
# 遍历词列表里的每一个词
for word in words:
if word not in stop_list: # 若不在停用词列表中就将结果追加至texts列表中
texts.append(word)
return texts
df['发帖内容'] = df['发帖内容'].apply(remove_stop)
#将列表元素转换为字符串,方便后续统计词频
def list_str(content):
return ' '.join(content)
df['content'] = df['发帖内容'].apply(list_str)
# 统计词频
text = ''
for s in df['content']:
text += s
data_cut = ' '.join(jieba.lcut(text))
frequency = collections.Counter(data_cut.split())
#取TOP200的词
count_list = sorted(frequency.items(), key=lambda x:x[1],reverse=True)
count_list = count_list[:200]
#画图
wordcloud = charts.WordCloud()
wordcloud.add('',count_list,word_size_range=[20,100],shape=SymbolType.DIAMOND)
wordcloud.render_notebook()
#查找性别词
def gender(word):
text = []
if "女朋友" in word or "征女" in word or "蒸女" in word:
text.append("男")
elif "男朋友" in word or "征男" in word or "蒸男" in word:
text.append("女")
return text
df['性别1'] = df['详情标题'].apply(gender)
df['性别2'] = df['发帖内容'].apply(gender)
#正则匹配年龄字符串
pattern = r"[9]\d{1}|[8]\d{1}|[2]\d{1}|[3]\d|[1]\d{3}"
re_obj = re.compile(pattern)
def number(text):
return re_obj.findall(text)
df['年龄'] = df['发帖内容'].apply(number)
#将列表元素转换为字符串(输出到excel)
def list_str(content):
return ' '.join(content)
df['年龄'] = df['年龄'].apply(list_str)
def list_str(content):
return ' '.join(content)
数据展示
1.总计616个信息有效的帖子,其中男性发帖371,女性发帖245,但男性发帖的回帖数量低于女性的回帖数量(女生还是比较内敛kkk)
2.男性年龄分布:30-34岁最多,25-29次之,看来男生果然不着急,相亲市场25+才是主角,但35+的就少多了,但整体年龄焦虑还比较小(0-19是因为我把没有年龄信息的帖子都标记为0,小声diss相亲不写年龄这种蜜汁操作)
3.女生年龄分布:25-29区间最多,基本上是第二名30-34的两倍了,感慨一下女生在婚恋问题上的焦虑感。。。。
4.发帖内容词云图
去除语气词,标点等,截取词频top200的词汇。kkk有点因锤丝听:
“喜欢,希望":大家对恋爱,婚姻还是比较乐观的,还抱有美好的期待
“工作,身高,性格”:硬指标
“160,170”:男生170,女生160是个坎