我做了一个有效的算法,但运行时间非常糟糕。是的,我从一开始就知道这将是可怕的但不是那么多。对于仅200000条记录,该程序运行一个多小时。
基本上我正在做的是:
for each searchfield in search fields
for each sample in samples
do a q-gram matching
if there are matches then return it
else
split the searchfield into uniwords
for each sample in samples
split sample into uniwords
for each uniword in samples
if the uniword is a known abbreviation
then search the dictionary for its full word or other known abbr
else do a jaro-winkler matching
average the distances of all the uniwords
if the average is above threshold then make it as a match and break
end for
if there is a match make a comment that it matched one of the samples partially
end else
end for
是的,这段代码很开心。我使用蛮力,因为召回非常重要。因此,我想知道如何让它更快,因为我不仅为数百万的数据运行200000数据而且客户端的计算机不是高端的(1GB-2GB的Ram Pentium 4或Dual-核心,我测试这个程序的计算机是一个双核,4GB的Ram)。我遇到了TF / IDF,但我不知道它是否足够。我想知道谷歌如何实时搜索。
提前致谢!
编辑: 该程序是数据过滤器。从200,000个虚拟数据(实际数据约为12M),我必须过滤与样本无关的数据(500个虚拟样本,我仍然不知道实际样本数量是多少)。
使用给定的虚拟数据和样本,运行时间约为1小时,但在此处和那里修补后,我已成功将其减少到10-15分钟。我通过对以相同字符开头的字段和样本进行分组(折扣特殊和无意义的单词,例如a,a)并将字段与具有相同第一个字符的样本进行匹配来减少它。我知道那里有一个问题。如果该字段在第一个字符拼写错误怎么办?但我认为这些数字可以忽略不计。样本拼写正确,因为它始终保持不变。
答案 0 :(得分:0)
你的编程语言是什么?我猜使用q = 2或3就足够了。我还建议从单克到更高的程度。