跳转到主要内容

吹走所有不必要的。

项目描述

在您的数据上撒一点宇宙尘埃。

成对对象去重

spacedust 是围绕 xgboostsklearn 的便利接口,提供构建成对去重模型的API。它的工作方式如下。

数据

您有两个数据列表,x1x2。对于这些列表中的每个元素,您知道它们是否是彼此的重复。让我们将此信息保存在长度相同的另一个列表 y 中。

例如,您有一份已知地址列表

addresses = ["123 Main Street", "420 5th Ave", "123, Main St"]

您知道第一和第三个元素指的是同一个地方,而第二个元素是一个不同的地址。您可能建立以下列表

x1 = [
    "123 Main Street",
    "123 Main Street",
    "123 Main Street",
    "420 5th Ave",
    "420 5th Ave",
    "420 5th Ave",
    "123, Main St",
    "123, Main St",
    "123, Main St"
]

x2 = [
    "123 Main Street",
    "420 5th Ave",
    "123, Main St",
    "123 Main Street",
    "420 5th Ave",
    "123, Main St",
    "123 Main Street",
    "420 5th Ave",
    "123, Main St"
]

y = [
    True,
    False,
    True,
    False,
    True,
    False,
    True,
    False,
    True
]

您如何构建这个列表?成对去重是一个明确的 监督学习 任务,这意味着我们需要标记的数据。“标记”意味着我们有一些示例,并知道它们是否是重复的。通常,这可能意味着一些人工时间用于标记东西,这不是很有趣,但不幸的是这是必要的。

特征

spacedust 比较数据点的成对,并基于您告诉它寻找的内容为每个成对生成 特征值。例如,您可能会查看这些数据并说,“好吧,如果街号相同,那是一个很好的指标(尽管不是保证),这些是相同的地方”。所以,您可能会得出这样的特征

def street_number_is_same(first, second):
    """Compares the street number and returns True if they're identical. Removes commas."""
    return first.split(" ")[0].replace(",", "") == second.split(" ")[0].replace(",", "")

然后,您可能查看一些不是布尔值的东西,比如Levenshtein距离,使用fuzzywuzzy包。

from fuzzywuzzy import fuzz

def street_name_is_same(first, second):
    return fuzz.ratio(first, second)

您可以组合您喜欢或需要的任何数量的功能。记住,功能是对数据的转换,使您的计算机更好地理解数据,或者突出显示数据的一些显著特征,这有助于您了解两个事物是否是重复的。这里的功能并不是特别出色,但它们是一个起点,我们将证明它们足以工作得相当好。

由于功能函数需要接受两个单独的对象进行比较,因此您可以在非Python原始数据类型或甚至不可序列化的东西周围构建去重器。如果您想比较Django对象,请随意进行

def commercial_properties_distance(first, second):
    lat_diff = first.primary_space.geography.latitude - second.primary_space.geography.latitude
    lon_diff = first.primary_space.geography.longitude - second.primary_space.geography.longitude
    return np.sqrt(lat_diff**2 + lon_diff**2)

构建去重器

最基本的去重器是从Dust类继承的,并需要一个功能函数列表。

from spacedust import Dust

class AddressDeduper(Dust):

    filename = "my_address_deduper"

    featureset = [
        street_number_is_same,
        street_name_is_same
    ]

您可以传递一些超参数用于模型调整(文档将提供),但到目前为止,这将使我们开始得相当好。

训练去重器

为了训练,您只需要您的三个列表,x1x2y。实例化您的去重器并调用fit()

deduper = AddressDeduper()
deduper.fit(x1, x2, y)

根据您的训练数据集的大小,这可能会从一秒到几分钟不等。从小(一点)开始,逐渐增加数据量,直到您不再愿意等待。

完成时,您将得到一个打印语句,告知您模型的准确率。此时,您的模型已完全训练并保存到磁盘上,在您提供的filename下。您准备好了!

使用去重器

我们正在努力完全保存整个对象,包括您的特征集。在此之前,我们有两种情况

您刚刚完成模型的训练,并且您的类对象deduper仍然在RAM中。

太好了。您只需调用.predict()即可。跳到预测部分。

您有一个新的Python内核,并且想将您的模型加载到RAM中。

此时,您需要重新定义您的类和功能——抱歉(正在努力中)。因此,您需要再次运行构建去重器部分的代码;然而,您无需再次训练模型,因为实例化时,我们会查找提供的文件名下的模型,如果存在,则加载它。所以,虽然我们再次需要您的特征集和文件名,但我们不需要花那么多时间调用.fit()

进行预测

此时,我们假设您有一个deduper对象在RAM中。您现在可以提供一些数据,它会返回一些概率。

deduper.predict(
    ["123 Main Street", "420 5th Ave", "123, Main St"],
    "123 Main Street"
)

.predict()接受两个参数。它们可以是列表、元组或np.ndarray可迭代对象,也可以是单个对象。如果它们是单个对象(如第二个参数所示),我们将为您将它们包装在列表中。

.predict()返回一个np.ndarray概率。如果您传递一个包含三个元素的列表和一个单个元素,它将返回一个(3, 1)-形状的np.ndarray,包含您参数之间每个可能配对的概率。如果您传递两个包含五个元素的列表,它将返回一个(5, 5)-形状的数组。该数组中(ij) th个元素是您的第一个列表的第ith个元素与您的第二个列表的第jth个元素重复的概率。

尽管有法国血统,我们尽量避免(过度)发表意见。因此,我们返回一个概率而不是布尔值来表示事物是否是重复的。我们将指定某个阈值以上的事物视为重复的决定权留给你。如果你不确定从哪里开始,0.5可能是一个不错的选择,但这并不保证。

安装

pip install spacedust

待办事项

  1. 序列化特征集并完成Dust模型保存

  2. 扩展文档以描述超参数

  3. 整理完整的示例笔记本

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分发

spacedust-0.1.3.tar.gz (7.7 kB 查看散列值)

上传时间

构建分发

spacedust-0.1.3-py3-none-any.whl (7.1 kB 查看散列值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面