【问题标题】:Classifier based on the format of input text基于输入文本格式的分类器
【发布时间】:2014-07-26 15:23:47
【问题描述】:

我正在寻找一种算法(在此基础上构建分类器),它可以测量两个输入文本之间的格式相似性。广义地说,是一种关于格式的 Levenshtein 距离。

例如,考虑有一个应用程序从不同来源收集日志数据,并按格式对其进行标记。

另一个例子考虑一个应用程序,它从不同的编程语言(假设它们不相似,所以 C 和 Haskell)接收输入作为源代码,并且能够按它们的格式对它们进行分类。

编辑:附加示例

考虑 df -h 运行的输出

Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/fedora-root   50G   12G   35G  26% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G  596K  3.9G   1% /dev/shm
tmpfs                    3.9G  9.1M  3.9G   1% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
tmpfs                    3.9G  580K  3.9G   1% /tmp
/dev/mapper/fedora-home  178G   82G   87G  49% /home
/dev/sda1                477M  147M  301M  33% /boot

这将与ls -l进行比较

total 68
drwxrwxr-x.  2 mhitza mhitza 4096 May 31 22:17 bin
drwxr-xr-x.  2 mhitza mhitza 4096 Jun  1 23:00 Desktop
drwxr-xr-x.  5 mhitza mhitza 4096 May 16 15:43 Documents
drwxr-xr-x. 12 mhitza mhitza 4096 Jun  4 19:08 Downloads
drwx------. 12 mhitza mhitza 4096 Mar 18 23:48 Dropbox
drwxrwxr-x. 12 mhitza mhitza 4096 Apr 30 02:08 Local

算法应该能够推断出这两种是不同类型的文本“结构”,并且能够为这些组分类其他类型的输入文本。

问题在于,对于一​​组固定的格式,这很容易做到,但我想在任何类型的输入上做到这一点。

【问题讨论】:

  • 如果您能进一步阐明“结构”的含义,这将是一个有趣的问题。例如。如何从输入文本中获得结构?它是用字符串、树来表示的吗?任何输入文本是否有一种可能的结构? (那么问题就简单了。)或者是否存在许多可能的结构,并且您想寻找分别来自文本 T1 和 T2 并且在某个度量中具有最小距离的结构 S1 和 S2?
  • 我已经更新了我的问题以澄清这里的结构意味着什么
  • 很高兴有更多的例子,但仍然非常不清楚你所说的“结构”到底是什么意思。在我们试图找到两个“结构”之间的 Levenshtein 距离之前,我们首先需要有一个实际的具体字符串 representation 这些结构!
  • 我不知道 levenshtein distance 是否适合这里的工具。结构在这里是文本的form,它具有算法会推断出的特定特征(列、每列的字符范围等)。我不知道还能怎么说,但把结构想象成散文和诗歌。您可以通过它们的“形式”直观地区分它们。
  • 我相信“格式”可能是一个更合适的术语。

标签: algorithm machine-learning classification


【解决方案1】:

根据我对问题的理解,您正在寻找一种表示任意文本的方法,以便可以根据数据的格式/结构对它进行分类或聚类,而不是根据数据的值。

天真的方法是只收集一组已知文档类型的解析器并按顺序应用它们,但是(除了笨拙之外)我认为您不想这样做,因为您希望该方法适用到任意结构(即:新​​的和/或不受支持的格式)。

我的第一个想法是,当您尝试根据结构而不是内容进行分类时,将尝试将您的文档简化为符号表示。

例如df -h 输出:

Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/fedora-root   50G   12G   35G  26% /
...

会变成:

STRING, SEP, STRING, SEP, STRING, SEP, STRING, SEP, STRING, SEP, STRING
FILEPATH, SEP, MEMSIZE, SEP, MEMSIZE, SEP, MEMSIZE, SEP, PERCENTAGE, SEP, FILEPATH
...

这可以实现,例如,通过应用一组不同的预定义正则表达式(不要忘记“我不知道”正则表达式)。

只需通过这一步,就很容易识别df -h 输出,因为它有一个标题行和一堆表格行,尽管它们具有不同的值,但都具有相同的符号表示。

要将其转化为有用的东西,您可以向它抛出bag of words model,并将每个符号行视为一个“单词”。

按照这种方法,您可以找到一组可区分的常见“单词”(又名符号行),您可以使用它们来创建每个文档的数字表示。这可以使用term frequency–inverse document frequency 之类的方法来完成,但可能会受益于使用监督学习方法(可能是递归特征消除之类的方法)。从那里开始,将其放入您最喜欢的分类或聚类算法中是一个相当简单的案例。

仅通过问题中给出的示例,它可能看起来像这样:

ls -l 输出:

total 68
drwxrwxr-x.  2 mhitza mhitza 4096 May 31 22:17 bin
...

会变成ls -l符号:

STRING, SEP, NUMBERS
STRING, SEP, NUMBER, SEP, STRING, SEP, STRING, SEP, NUMBERS, SEP, STRING, SEP, NUMBER, SEP, TIME, SEP, FILEPATH
...

为简洁起见,我们将这些符号行称为L1L2,类似地称为df -h 符号行D1D2。这意味着我们可以将这两个示例文档表示如下:

ls -l: D1:0, D2:0, L1:1, L2:6
df -h: D1:1, D2:8, L1:0, L2:0

【讨论】:

    猜你喜欢
    • 2017-09-19
    • 2012-08-19
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多