实现Python中的机器学习算法更好的办法(Better way to implement a Ma

2019-09-24 01:05发布

我在做一些网页刮。 其中一个我所遇到的问题是,我有时刮表的列标题在他们的语言不同,刚好够我试图用fuzzywuzzy来检查他们的“亲近”

我的程序与标签的列表开始。 这些标签都是从我都刮掉网页的表格的列标题。 此外,还要求我给你“归列标题”至少一些 - 这些服务为基础的“学习”

matched_labels_dict{label_1:value_1,label_2:value_2,label_3:value_1, . . .}

这本词典表明label_1和label_3是同义词,label_2是不是其中的代名词,但可能是一些其他标签的字典中的一个代名词

我也有un_matched_labels名单

un_matched_labels=[label_324,label_325,label_326, . . .]

数字后缀只是占位

我有一个使用功能fuzzywuzzy生成一个分数每个标签的un_matched_labels在matched_labels_dict标签比较。 如果匹配的MAX_SCORE比一些预定的水平更高(可以说90)然后被测试的标签被添加到matched_labels_dict和分配了相同的值,它相匹配的标签了。 因此,假设我在un_matched_labels测试label_424和最大匹配得分的94发生时它相比label_3,我再更新matched_labels_dict

 matched_labels_dict{label_1:value_1,label_2:value_2,label_3:value_1, label_424:value_1. . .}

现在,机器学习来发挥作用,因为假设label_324将有一个匹配得分为91 label_424

但它有一个匹配率已经VALUE_1为比我的临界值低的东西其价值(label_1和label_3)(在这种情况下90)中的所有其他标签。

label_324不会被匹配到label_424在matched_labels_dict。

因为为了label_324被测试的标签不会被添加,因为当它被测试label_424不在matched_labels_dict(测试被顺序地执行)。

为了处理,我重新运行匹配函数(称为在下面的代码块do_machine_learning)。

下面是do_machine_learning功能all_labels被标签的列表,matched_label_dict是已公知的标签值的匹配,是在上述形式的字典

def do_machine_learning(all_labels,matched_labels_dict):
for test_label in all_labels:
    if test_label not in matched_labels_dict:
        temp_fuzzy_dict={label : fuzz.token_sort_ratio(label.upper(),test_label.upper()) for label in matched_labels_dict.keys()}
        fuzzy_dict={key : temp_fuzzy_dict[key] for key in temp_fuzzy_dict if temp_fuzzy_dict[key] > 91}
        try:
            max_value=max(fuzzy_dict.values())
            for label in fuzzy_dict:
                if fuzzy_dict[label]== max_value:
                    matched_labels_dict[test_label]=matched_labels_dict[label]
                    break
        except ValueError:
                    pass
return matched_labels_dict

我想重新运行的匹配功能(这会再加入label_324到字典中,因为它的比赛成绩与label_424),直到matched_labels_dictionary保持在两个迭代之间的大小不变。 因为没有更多的比赛被发现,这将在尺寸保持不变。

这里是我正在做这个,我随意设定的周期为100的极限

for number in range(1,100):

    print 'cycle', number, 'number_of_matches', len(matched_labels_dict)
    x=do_machine_learning(all_labels,matched_labels_dict)
    if len(x)==len_matched_labels:
        break
    else:
        len_matched_labels=len(x) 

该do_machine_learning功能就是无与伦比的标签进行比较,并取得了对匹配的标签。 一旦unmatched_labels通过它第一次运行时的matched_labels_dict返回,程序匹配的标签数与匹配的标签在上一次迭代的数量进行比较。 如果数量增加,则标签被再次送到查看是否有新的比赛可以进行。 如果没有完成正在取得新的匹配,则程序跳出循环的运行通过。 有人问我,把我的do_machine_learning功能,但我认为这是无关紧要我的问题是如何更pythonically循环回路上方

所以,问题是我怎么更干净设立这个反复的过程?

那么问题是封闭的,我真的不明白为什么,但我想我找到了一个更好 - 更清洁的方式来处理这个问题,至少它为我工作我调用该函数从内部本身,直到其大小保持不变

def do_machine_learning(all_labels,matched_labels_dict, min_score):
    initial_size=len(matched_labels_dict)  # added this assignment
    for test_label in all_labels:
        if test_label not in matched_labels_dict:
            temp_fuzzy_dict={label :               fuzz.token_sort_ratio(label.upper(),test_label.upper()) for label in matched_labels_dict.keys()}
        fuzzy_dict={key : temp_fuzzy_dict[key] for key in temp_fuzzy_dict if temp_fuzzy_dict[key] > min_score}
        try:
            max_value=max(fuzzy_dict.values())
            for label in fuzzy_dict:
                if fuzzy_dict[label]== max_value:
                    matched_labels_dict[test_label]['NEW_LABEL'] = matched_labels_dict[label]['NEW_LABEL']
                    matched_labels_dict[test_label]['FUZZ_SCORE'] = max_value
                    matched_labels_dict[test_label]['BEST_MATCH'] = label
                    break
        except ValueError:
                    pass
    if len(matched_labels_dict)!=initial_size:           # added this loop
        do_machine_learning(all_labels,matched_labels_dict, min_score)
return matched_labels_dict

这些细微的变化,我可以通过调用函数

new_matched_labels=do_machine_learning(all_labels,matched_labels_dict)

这些变化完全消除了与开始循环的需要

for number in range(1,100):
文章来源: Better way to implement a Machine Learning algorithm in Python