对文件名进行排序的聚类算法

数据挖掘 分类 聚类 k-均值
2022-03-07 15:23:52

一个客户想要整理他的文件系统(大约 1,000,000,000 个文件),这些文件系统多年来一直由许多工作人员提供,每个工作人员都有自己未知的命名约定,例如:

  • [日期]-[客户]-[文件名]
  • [类型]-[客户]。[日期][文件名]
  • ...

这里有四个示例(大约 1,000,000,000 个文件)以使事情更清楚:

JPM_TPD0001662_2009124012302000451.pdf

JPMF_STA_1712010832_18001_LUX_approval.pdf

CHACN05CTRP_00111.001.pdf

CHACN63CJO1_00018.001.pdf

目的是找出命名约定中的模式,但我不能使用正则表达式,因为约定是先验未知的。

我想知道是否有一种聚类算法能够根据文件的命名约定对文件进行分组。

任何适用于字符串的 K-Mean 哲学?

4个回答

这根本不是一个典型的聚类问题,所以我怀疑这些算法中的任何一个都会有所帮助。如果您想尝试聚类,则需要进行适当的特征提取不要指望原始数据会起作用。但我想一旦你有了好的特性,问题就已经解决了。

与其试图将其视为一个聚类问题,不如从顺序模式的角度来看待它,或者甚至更好:看看关于如何从一组字符串中学习正则表达式的几个问题。

对于那些对类似问题的解决方案感兴趣的人,我通过以下步骤找到了解决方案:

  1. 在“_”上拆分文件名,生成 n 个字符串

  2. 取每个字符串的长度

  3. 运行 KMeans(使用 Gap Statistics 优化 K)

  4. 每个集群抽取一个样本并通过自定义函数将其逆向工程为通用正则表达式

在实践中,以下是 10 个文件的示例:

在此处输入图像描述

在此处输入图像描述

文件 0 在 " " 上拆分为长度分别为 3、10 和 23 的组。文件 3 在 " " 上分别分成长度为 11 和 13 的组。文件 5 在“_”上拆分为长度分别为 4、3、10、5、3 和 12 的组。

文件 0、1 和 2 属于同一个集群,并且具有相同的命名约定。文件 3、4、6、7、8 和 9 属于同一个集群,并且具有相同的命名约定。文件 5 属于另一个集群,并且还有另一个命名约定。

使用正则表达式解析

我从事一个项目,我们每天从大约 10 个不同的系统中获取数千个数据文件。文件名都是混乱的,并且随着时间的推移有变化的趋势。这是正则表达式的工作。

我用来组织的主要东西是功能分组。我只是使用每个文件集共有的一小组指标。就我而言,聚合数据文件并将其发送给我的服务器会将其名称附加到文件名(zs2101 或类似名称)。因此,我在文件名中搜索这组有限的正则表达式(我目前使用 20 个)。在您的情况下,文件头中的客户端名称似乎是您可以搜索用于组织基础的名称

然后,我按数据的生成日期划分文件。每个文件都带有一个时间戳。当我将文件读入存档时,我会在每个文件中找到日期字段并将其转换为标准格式,然后更改文件名以反映该标准格式。现在我为每个服务器名称构建一个目录树,按日期组织(在我的例子中,每年一个文件夹,每个月一个子文件夹)。

我的建议是使用正则表达式来组织数据。这些是确定性的,如果你收到一个奇怪的文件头或格式错误的文件名,你知道它会在哪里结束(在我的例子中,有一个“未确定”文件夹接受与服务器或日期正则表达式不匹配的所有内容)。k-means 的问题在于,如果你得到了一些你没有计划的东西,那么很难判断聚类算法会将它放在哪里,从而导致数据丢失。

祝你好运,希望这会有帮助。

如果您事先不知道模式,那么进行自动分组将非常困难。

但是,您可以采取以下方法

步骤 - 1 -根据可以完成的分组
定义基本规则(数据驱动)(例如以特定范围内的数字开头JPM_、以特定范围内的数字结尾、文件大小、来源等)

Step - 2 -
除非直接匹配到 group,否则规则应该针对 group 但具有可以进行手动验证的暂存状态。如果有直接匹配,直接应用第 4 步

Step-3-手动验证
,将其状态更改为已验证

Step - 4 -
记住输入和已验证的输出,以便下次出现相同的输入时,直接将它们放在同一个已验证的组中。

基本上,您的手动验证将是您的机器学习,有两个优点

  • 在适当的时候,机器将能够自行做出决定。

  • 流程易于调试、验证和移植到另一个系统。