吹走所有不必要的。
项目描述
在您的数据上撒一点宇宙尘埃。
成对对象去重
spacedust 是围绕 xgboost 和 sklearn 的便利接口,提供构建成对去重模型的API。它的工作方式如下。
数据
您有两个数据列表,x1 和 x2。对于这些列表中的每个元素,您知道它们是否是彼此的重复。让我们将此信息保存在长度相同的另一个列表 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
]
您可以传递一些超参数用于模型调整(文档将提供),但到目前为止,这将使我们开始得相当好。
训练去重器
为了训练,您只需要您的三个列表,x1、x2和y。实例化您的去重器并调用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)-形状的数组。该数组中(i,j) th个元素是您的第一个列表的第ith个元素与您的第二个列表的第jth个元素重复的概率。
尽管有法国血统,我们尽量避免(过度)发表意见。因此,我们返回一个概率而不是布尔值来表示事物是否是重复的。我们将指定某个阈值以上的事物视为重复的决定权留给你。如果你不确定从哪里开始,0.5可能是一个不错的选择,但这并不保证。
安装
pip install spacedust
待办事项
序列化特征集并完成Dust模型保存
扩展文档以描述超参数
整理完整的示例笔记本
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。
源分发
构建分发
spacedust-0.1.3.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 4a306cc82f5ce35c136e5785ae15c7e9eb144f0c1b04a8b80aac73880f958296 |
|
MD5 | 101db04f03145e9d4166c2efe573cbed |
|
BLAKE2b-256 | 8b7b6dd304b879c534dfd9791063cafbdbca216e37a9b375294a921f5f081141 |
spacedust-0.1.3-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 4205de5ae9ecc2c29e4175fe702e9f024c5163de4f5d0fbe3664dc9b6dd9af86 |
|
MD5 | 899e2e2c2d3e54a7264f1b44f37aec0e |
|
BLAKE2b-256 | 9d95b64074e2765ae6ec8091d0833d2f3e7a6263fd5fa7011f597ba4a47ed8bc |