【发布时间】:2018-01-10 04:13:08
【问题描述】:
我要做的是按员工的角色对他们进行分类 在一个组织中。这是通过获取所有权限来计算的,或者 访问列表,他们拥有目标企业软件。
可能有 10000 个用户和每个用户数十个权限。
编辑:当有大量用户时,绝大多数将具有有限的设置权限。例如,他们可能都只有Employee。更复杂的案例是高级用户,并且会更少。
另外,不要被我给出的权限名称所误导,例如 Acct1/Acct2,它们只是为了让您了解域。即使像您在许多 ORM 商店中看到的那样随机分配的主键整数,我正在寻找的解决方案在概念上也应该有效 - 权限之间存在 no 隐含关系。
import pprint
pp = pprint.PrettyPrinter(indent=4)
def classify(employees):
"""employees assigned the same set
of permissions are grouped together"""
roles = dict()
for user, permissions in employees.items():
permissions = list(permissions)
permissions.sort()
key = tuple(permissions)
members = roles.setdefault(key, set([]))
members.add(user)
return roles
everyone = {
"Jim": set(["Employee","Acct1","Manager"]),
"Marion": set(["Employee","Acct1","Acct2"]),
"Omar": set(["Employee","Acct1"]),
"Kim": set(["Employee","Acct1"]),
"Tyler": set(["Employee","Acct1"]),
"Susan": set(["Employee","Marketing","Manager"]),
}
result = classify(everyone)
print("pass1")
pp.pprint(result)
此时,分类系统返回如下:
{ ('Acct1', 'Acct2', 'Employee'): set(['Marion']),
('Acct1', 'Employee'): set(['Kim', 'Omar', 'Tyler']),
('Acct1', 'Employee', 'Manager'): set(['Jim']),
('Employee', 'Manager', 'Marketing'): set(['Susan'])}
由此,我们可以观察数据并手动为这些角色分配一些有意义的名称。
Senior Accountants - Marion
Accounting Managers - Jim
Accountants - Kim, Omar, Tyler
Marketing Manager - Susan
分配是手动的,但其目的是尽可能保持“粘性”,即使人们被雇用或离开以及权限发生变化。
让我们再做一遍。
有人决定将Acct2 重命名为SrAcct。人们被录用,Kim 离开。
这由以下员工权限表示:
everyone2 = {
"Jim": set(["Employee","Acct1","Manager"]),
"Marion": set(["Employee","Acct1","SrAcct"]),
"Omar": set(["Employee","Acct1"]),
"Tyler": set(["Employee","Acct1"]),
"Milton": set(["Employee","JuniorAcct"]),
"Susan": set(["Employee","Marketing","Manager"]),
"Tim": set(["Employee","Marketing"]),
}
这次的输出是:
{ ('Acct1', 'Employee'): set(['Omar', 'Tyler']),
('Acct1', 'Employee', 'Manager'): set(['Jim']),
('Acct1', 'Employee', 'SrAcct'): set(['Marion']),
('Employee', 'JuniorAcct'): set(['Milton']),
('Employee', 'Manager', 'Marketing'): set(['Susan']),
('Employee', 'Marketing'): set(['Tim'])}
理想情况下,我们会认识到这一点
Senior Accountants - Marion
Accounting Managers - Jim
Accountants - Omar, Tyler
Marketing Manager - Susan
new role - Tim
new role - Milton
Tim 的角色现在将命名为 Marketer,而 Milton 的角色将命名为 Junior Accountant。
重要的是角色名称分配足够稳定,即使在人们被雇用和离开(最频繁)以及权限被添加或重命名(非常不频繁)时,也可以对员工群体进行推理。可以不时要求最终用户分配新的角色名称或在关系之间做出决定。但大多数时候,它应该运行顺利。它不应该猜错了什么,并错误地将一组用户标记为错误的角色名称。
我遇到的问题是它很容易引起注意,但是权限集和定义角色的用户集都可以更改。分类时间很重要,但是这种分类机制的价值会随着用户数量和权限的增加而增加。
我尝试提取“定义角色的权限子集”。例如,Employee 分配给每个人,因此可以忽略。而(Manager, Acct1)、(Manager, Marketing) 唯一属于 Jim 和 Susan。麻烦的是,一旦您轻松解决了 20-30% 的案例并且它永远不会完成,就会出现组合爆炸。
我现在的想法是回溯并计算每一代的新员工权限角色分类,然后回溯以获得与上一代相比的模糊匹配“最佳匹配”。选择那些相当明确的并要求用户决定关系并根据需要分配新的角色名称。
例如,权限的完全匹配和员工的合理匹配意味着 'Omar', 'Tyler' 在第 2 次传递时仍然是 Accountants。另一方面,如果 Marion 离开而我拥有 "Jane": set(["Employee","Acct1","SrAcct"]),我会必须要求最终用户进行仲裁并将她识别为Senior Accountant。
我过去曾与 Jaccard Similarity (https://en.wikipedia.org/wiki/Jaccard_index) 合作过,但我不确定它如何适用于双方都可以改变的情况 (Acct2 => SrAcct as以及员工变动)。
我很确定以前需要这种逻辑,所以我希望对算法和策略提出建议。
哦,我正在寻找可以在更大的 Python 应用程序的上下文中实现和推理的合理独立的方法。不适用于 机器学习 关于如何配置 TensorFlow 之类的工具来为我执行此操作的建议。不过,如果迫在眉睫,我可以调用一个批处理来进行匹配。
【问题讨论】:
标签: python algorithm classification