文档章节

过滤豆瓣租房小组中介贴之 python 实现余弦相似度(转)

好铁
 好铁
发布于 2017/04/04 18:28
字数 1028
阅读 44
收藏 0

前几天做了个微信找房机器人, 爬取豆瓣租房小组的时候发现很多伪装的中介帖,如下这种格式:

可月付 无中介 方庄地铁附近 芳城园一区单间出租

可月付 无中介 方庄地铁附近 芳城园一区主卧次卧出租

方庄地铁附近 芳城园一区次卧出租

豆瓣对于小组的帖子有个简单的过滤,如果标题完全一样,就会直接删除,所以中介们一般都会在标题改几个字,内容也会调整下顺序。其实对于这种问题,有简单的方案实现,比如下文介绍的余弦相似度。

关于余弦相似度的原理其实很简单,参考这篇文章TF-IDF与余弦相似性的应用(二):找出相似文章
屏幕快照 2016-11-24 下午2.25.45

python 实现如下:

(一) 对文本分词

def cut_word(content):
    tags = jieba.analyse.extract_tags(content, withWeight=True, topK=20)
    return tags


这里用了 jieba ,分词什么的它太有用了
返回结果

'''
(u'\u65b9\u5e84', 2.4582479479)
(u'\u82b3\u57ce\u56ed', 1.19547675029)
(u'\u53ef\u6708\u4ed8', 1.19547675029)
(u'\u4e00\u533a', 1.04666904475)
(u'\u5355\u95f4', 1.02371160058)
(u'\u51fa\u79df', 0.832472854883)
(u'\u5730\u94c1', 0.8200234078590001)
(u'\u4e2d\u4ecb', 0.7891864466530001)
(u'\u9644\u8fd1', 0.516934129144)
'''

(二) 返回两个文本词频的多维向量

def merge_tag(tag1=None, tag2=None):
    v1 = []
    v2 = []
    tag_dict1 = {i[0]: i[1] for i in tag1}
    tag_dict2 = {i[0]: i[1] for i in tag2}
    merged_tag = set(tag_dict1.keys()+tag_dict2.keys())
    for i in merged_tag:
        if i in tag_dict1:
            v1.append(tag_dict1[i])
        else:
            v1.append(0)
        if i in tag_dict2:
            v2.append(tag_dict2[i])
        else:
            v2.append(0)
    return v1, v2

(三) 计算余弦相似度

def dot_product(v1, v2):
    return sum(a * b for a, b in zip(v1, v2))
def magnitude(vector):
    return sqrt(dot_product(vector, vector))
def similarity(v1, v2):
    '''计算余弦相似度
    '''
    return dot_product(v1, v2) / (magnitude(v1) * magnitude(v2) + .00000000001)

(四) 结果
我们取一些样本做例子,内容为标题+详情

# https://www.douban.com/group/topic/93410497/
    content1 = u"""
                可月付 无中介 方庄地铁附近 芳城园一区单间出租
                我的房子在方庄地铁附近的芳城园一区,正规小区楼房,
                三家合住,现出租一间主卧和一间带小阳台次卧,室内家电齐全,
                冰箱,洗衣机等都有,可洗澡上网,做饭都可以,小区交通便利,四通八达,
                希望入住的是附近正常上班的朋友
                """
    # https://www.douban.com/group/topic/93410328/
    content2 = u"""
                可月付 无中介 方庄地铁附近 芳城园一区主卧次卧出租
                我的房子在方庄地铁附近的芳城园一区,正规小区楼房,
                三家合住,现出租一间主卧和一间带小阳台次卧,室内家电齐全,
                冰箱,洗衣机等都有,可洗澡上网,做饭都可以,小区交通便利,四通八达,
                希望入住的是附近正常上班的朋友
                """
    # https://www.douban.com/group/topic/93410308/
    content3 = u"""方庄地铁附近 芳城园一区次卧出租
                    我的房子在方庄地铁附近的芳城园一区,正规小区楼房,
                    三家合住,现出租一间主卧和一间带小阳台次卧,室内家电齐全,
                    冰箱,洗衣机等都有,可洗澡上网,做饭都可以,小区交通便利,四通八达,
                    希望入住的是附近正常上班的朋友
                    """
    # https://www.douban.com/group/topic/93381171/
    content4 = u"""二环玉蜓桥旁下月27号后可入住二居
                方庄方古园一区5号楼下月27日到期出租,
                我是房主无中介费 ,新一年租6000元每月押一付三,主次卧可分开住。
                距地铁5号线蒲黄榆站5分钟路程。房屋60平正向,另有看守固定车位。

测试结果如下, 越接近 1 则两者文章越相似

content1 和 content2 相似度为: 0.968802386285
content1 和 content3 相似度为: 0.926323584519
content2 和 content3 相似度为: 0.921885685549
content2 和 content4 相似度为: 0.174889264654

说明 content1 content2 content3 很可能是中介批量发的帖子

这次只是简单的研究下,如果要起到更好效果,就得有这些关键词的语料,然后加权重。
代码见 cosine_similarity.py

本文转载自:https://facert.github.io/2016/11/24/%E8%BF%87%E6%BB%A4%E8%B1%86%E7%93%A3%E7%A7%9F%E6%88%BF%E5%B0%8F%

好铁
粉丝 39
博文 267
码字总数 78926
作品 0
朝阳
程序员
私信 提问
基于用户的协同过滤算法的理解与简单实现

概述 最近在做一个有关图书推荐系统的项目,因此就涉及到了协同过滤算法。自己主要负责基于用户的协同过滤算法(User-CF)的实现,因此阅读了部分书籍与文章,也基于组员爬取的豆瓣图书评论数...

cjl72513
2017/12/08
0
0
计算两个字符串相(或句子)似度的方法

主要方法有:编辑距离、余弦相似度、模糊相似度百分比 1 编辑距离 编辑距离(Levenshtein距离)详解(附python实现) 使用Python计算文本相似性之编辑距离 2 余弦相似度 余弦计算相似度度量 ...

致Great
2018/05/11
0
0
作为前端,如何帮帝都的朋友租到合适的房子

在帝都打拼的小伙伴都知道,要租个合适的房子真心不易。中介要收一个月的房租作为中介费。而且很多黑中介打着租房的旗号各种坑蒙拐骗。要想在茫茫帖子中找到真正的房东,宛如大海捞针,同时需...

志如
2018/07/12
0
0
作为前端,如何帮帝都的朋友租到合适的房子?

  在帝都打拼的小伙伴都知道,要租个合适的房子真心不易。中介要收一个月的房租作为中介费。而且很多黑中介打着租房的旗号各种坑蒙拐骗。要想在茫茫帖子中找到真正的房东,宛如大海捞针,同...

志如
2018/05/29
0
0
推荐系统--基于用户的协同过滤算法

概述 和搜索引擎一样,推荐系统是为了帮助人们更快速的获得对自己有用的信息。 和搜索引擎不同,推荐系统是人们被动的获取,由系统根据用户行为或其他的信息推荐给用户的,儿搜索引擎是用户主...

欣儿
2014/05/16
477
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
12
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
22
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
17
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
29
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部