我有以下问题,并认为我可以使用机器学习但我不完全确定它将适用于我的用例.
我有一个大约一亿条记录的数据集,其中包含客户数据,包括姓名,地址,电子邮件,电话等,并希望找到一种方法来清理这些客户数据并识别数据集中可能存在的重复数据.
大多数数据都是使用没有验证的外部系统手动输入的,因此我们的许多客户在我们的数据库中最终得到了多个配置文件,有时每个记录中都有不同的数据.
对于实例我们可能为客户John Doe提供5个不同的条目,每个条目都有不同的联系方式.
我们还有这样的情况:代表不同客户的多个记录在电子邮件等关键字段上匹配.例如,当客户没有电子邮件地址但数据输入系统需要时,我们的顾问将使用随机电子邮件地址,导致许多不同的客户档案使用相同的电子邮件地址,同样适用于电话,地址等.
我们的所有数据都在Elasticsearch中编制索引并存储在SQL Server数据库中.我的第一个想法是使用Mahout作为机器学习平台(因为这是一个Java商店)并且可能使用H-base来存储我们的数据(仅仅因为它适合Hadoop生态系统,不确定它是否具有任何实际价值),但是我读到的越多,我对它的工作方式就越困惑,对于初学者我不知道我能使用哪种算法,因为我不确定这个问题在哪里,我可以使用聚类算法或分类算法吗?当然,必须使用某些规则来确定配置文件的唯一性,即哪些字段.
我们的想法是最初将其部署为客户资料重复数据删除服务,我们的数据输入系统可以使用这些服务在输入新的客户资料时验证和检测可能的重复项,并且将来可能将其发展为分析平台以进行收集洞察我们的客户.
任何反馈将不胜感激:)
谢谢.
recommendation-engine machine-learning duplicates mahout record-linkage
我有一个大型数据库(可能在数百万条记录中),文本串相对较短(按街道地址,名称等顺序排列).
我正在寻找一种去除不精确重复的策略,模糊匹配似乎是首选方法.我的问题:许多文章和SO问题涉及将单个字符串与数据库中的所有记录进行匹配.我希望立即对整个数据库进行重复数据删除.
前者是线性时间问题(将值与一百万个其他值进行比较,每次计算一些相似性度量).后者是一个指数时间问题(将每个记录的值与每个其他记录的值进行比较;对于一百万条记录,这与前一个选项的1,000,000次计算相比,大约为5 x 10 ^ 11次计算).
我想知道是否有另一种方法,而不是我提到的"蛮力"方法.我想可能生成一个字符串来比较每个记录的值,然后对具有大致相等的相似性度量的字符串进行分组,然后通过这些组运行暴力方法.我不会达到线性时间,但它可能有所帮助.此外,如果我正确地考虑这一点,这可能会错过字符串A和B之间潜在的模糊匹配,因为它们与字符串C(生成的校验字符串)的相似性尽管彼此非常相似但是非常不同.
有任何想法吗?
PS我意识到我可能在时间复杂度上使用了错误的术语 - 这是一个我基本掌握的概念,但不够好,所以我可以在现场将算法放入适当的类别.如果我使用了错误的术语,我欢迎更正,但希望我至少得到了我的观点.
编辑
一些评论者提出,鉴于记录之间的模糊匹配,我的策略是选择要删除哪些(即给出"foo","boo"和"coo",这将被标记为重复并删除).我应该注意,我不是在寻找自动删除.其目的是在6000万个记录数据库中标记可能的重复数据,以供人工审查和评估之用.如果有一些误报,可以,只要它是一个大致可预测/一致的数量.我只需要了解复制品的普遍程度.但是如果模糊匹配传递需要一个月才能运行,那么这首先不是一个选项.
这是一个有趣的问题.
我有一个带有名称和地址信息的oracle数据库,需要保持最新状态.
我们从许多不同的gov't源获取数据,并且需要找出匹配项,以及是否使用数据更新db,或者是否需要创建新记录.
没有任何类型的唯一标识符可用于将记录绑定在一起,并且数据质量并不总是那么好 - 总会有拼写错误,人们使用不同的名称(即Joe vs. Joseph)等.
我有兴趣听到那些曾经解决过这类问题的人,以及他们如何解决这个问题,或至少是自动化部分问题.
我想从许多观察中创建一个直方图(即d < - c(1,2.1,3.4,4.5)),然后突出显示特定观察所在的bin,这样我的输出看起来像这样: alt text http://img686.imageshack.us/img686/5061/observationhist.png
我怎么在R?
我正在开发一个应用程序,它必须能够在存储在sql server DB中的数十万个联系信息中找到并合并重复项.我必须比较表中的所有列,每列都有一个权重值.比较必须基于重量值.基于比较结果和等价程度,我必须决定自动合并联系人或请求用户注意.我知道有许多用于重复数据删除的模糊逻辑算法.
在http://www.melissadata.com/中阅读有关N-gram或基于Q-gram的算法.这个算法对大量数据是否可行?如果没有,任何人都可以用一些算法指导我或者告诉我从哪里开始?
我想要实现的一个例子,
Gonzales = Gonzalez (two different spelling of different name)
Smith = Smyth (Phonetic sound the same)
123 Main st = 123 Main street (abbrevation)
Bob Smith = Robert Smith (synonym)
Run Code Online (Sandbox Code Playgroud) 在查看 Python 中用于记录重复数据删除的 Dedupe 库的示例时,我发现它在输出文件中创建了一个Cluster Id列,根据文档指示哪些记录相互引用。尽管我无法找出Cluster Id之间的任何关系以及这如何帮助查找重复记录。如果有人对此有所了解,请向我解释这一点。这是重复数据删除的代码。
# This can run either as a python2 or python3 code
from future.builtins import next
import os
import csv
import re
import logging
import optparse
import dedupe
from unidecode import unidecode
input_file = 'data/csv_example_input_with_true_ids.csv'
output_file = 'data/csv_example_output1.csv'
settings_file = 'data/csv_example_learned_settings'
training_file = 'data/csv_example_training.json'
# Clean or process the data
def preProcess(column):
try:
column = column.decode('utf-8')
except AttributeError:
pass
column = unidecode(column)
column = re.sub(' +', ' ', column)
column …Run Code Online (Sandbox Code Playgroud) 我有一个有点高级别的问题,所以我会尝试尽可能具体.
我正在进行大量研究,涉及将不同的数据集与引用同一实体(通常是公司或财务安全性)的标题信息相结合.此记录链接通常涉及标题信息,其中名称是唯一的公共主要标识符,但通常可用某些辅助信息(例如城市和州,操作日期,相对大小等).这些匹配通常是一对多,但可能是一对一甚至多对多.我通常手工完成这种匹配或者对清理过的子串进行非常基本的文本比较.我偶尔使用一种简单的匹配算法,比如Levenshtein距离测量,但我从来没有太多的东西,部分是因为我没有一个很好的正式应用方法.
我的猜测是,这是一个相当普遍的问题,并且必须有一些正式的流程可以用来做这类事情.我已经阅读了一些关于这个主题的学术论文,这些论文涉及给定方法的理论适用性,但我没有找到任何有用的资料来完成一个配方或至少一个实际的框架.
我的问题如下:
有没有人知道实现多维模糊记录匹配的良好来源,如书籍或网站,发表的文章或工作文件?
我更喜欢有实际例子和明确方法的东西.
该方法可以是迭代的,人工检查中间阶段的改进.
(编辑)链接数据用于统计分析.因此,一点点的噪音是可以的,但是对于较少的"错误的不匹配"而言,更少的"不正确的匹配"是强烈的偏好.
如果他们在Python中是很棒的,但不是必需的.
最重要的是,如果重要的是,我不太关心计算效率.我没有动态实现它,我通常处理几千条记录.
theory algorithm string-matching fuzzy-comparison record-linkage
我正在尝试使用该Dedupe包将一个小杂乱的数据合并到一个规范表.由于规范表非常大(1.22亿行),我无法将其全部加载到内存中.
目前的做法,我使用基于关闭这个发生在测试数据一整天:存储在一个字典凌乱数据的300K行的表,并将其存储在MySQL的规范数据的60万行的表.如果我在内存中完成所有操作(作为dict读取规范表),它只需要半个小时.
有没有办法让这个更有效率?
blocked_pairs = block_data(messy_data, canonical_db_cursor, gazetteer)
clustered_dupes = gazetteer.matchBlocks(blocked_pairs, 0)
def block_data(messy_data, c, gazetteer):
block_groups = itertools.groupby(gazetteer.blocker(messy_data.viewitems()),
lambda x: x[1])
for (record_id, block_keys) in block_groups:
a = [(record_id, messy_data[record_id], set())]
c.execute("""SELECT *
FROM canonical_table
WHERE record_id IN
(SELECT DISTINCT record_id
FROM blocking_map
WHERE block_key IN %s)""",
(tuple(block_key for block_key, _ in block_keys),))
b = [(row[self.key], row, set()) for row in c]
if b:
yield (a, b)
Run Code Online (Sandbox Code Playgroud) 我需要在大型数据集中查找重复项,因此我正在测试重复数据删除python 库。
我知道建议用于小型数据集,所以我认为使用好的机器可以提高性能。我有一台具有 56 GB RAM 的机器,并且正在针对包含 200000 行的数据集运行类似于“csv_example”的测试。它可以工作,但内存使用率非常低,处理(CPU)也非常低。
阻塞阶段似乎花费了太长的时间:
INFO:dedupe.blocking:10000, 110.6458142 seconds
INFO:dedupe.blocking:20000, 300.6112282 seconds
INFO:dedupe.blocking:30000, 557.1010122 seconds
INFO:dedupe.blocking:40000, 915.3087222 seconds
Run Code Online (Sandbox Code Playgroud)
谁能帮助我改进使用情况,或者告诉我是否有任何库/设置可以使程序使用更多可用资源?
duplicates ×5
algorithm ×3
python ×3
r ×2
data-quality ×1
dedupeplugin ×1
fuzzy ×1
fuzzy-logic ×1
histogram ×1
mahout ×1
mysql ×1
pyspark ×1
stata ×1
theory ×1