【问题标题】:NLP: Stemming on opcodes data setNLP:基于操作码数据集的词干
【发布时间】:2019-02-25 20:22:47
【问题描述】:

我有一个包含 27 个文件的数据集,每个文件都包含操作码。我想使用词干将相似操作码的所有版本映射到相同的操作码中。例如:push、pusha、pushb 等都会映射到 push; addf addi to add,multi multf to mult 等)。我该怎么做?我尝试将 PorterStemmer 与 NLTK 扩展一起使用,但它不适用于我的数据集。我认为它只适用于正常的人类语言单词。 (就像玩过,玩过 --> 玩)而不是像 (pusha, pushb --> push) 这样的操作码。

【问题讨论】:

    标签: nlp nltk stemming porter-stemmer


    【解决方案1】:

    我不认为词干是你想要在这里做的。词干是特定于语言的,并且基于该语言中常见的屈折形态模式。例如,在英语中,您有动词的不定式形式(例如,“to walk”),它会针对时态、体态和人/数进行屈折变化:I walk vs. She walks (walk+s), I walk vs. walk (walk+ed),也walk+ing 等等。词干将这些随机分布编码为“规则”,然后将这些规则应用于“单词”以改变其词干。换句话说,您的操作码不存在现成的词干分析器。

    您有两种可能的解决方案:(1) 创建字典或 (2) 编写自己的词干分析器。如果您没有太多要映射的变体,那么创建一个自定义字典可能是最快的,您可以在其中使用所有单词变体作为键,而 lemma/stem/canonical-form 是值。

    addi -> add
    addf -> add
    multi -> mult
    multf -> mult
    

    如果您的潜在映射太多而无法手动完成,那么您可以编写一个自定义的正则表达式词干分析器来进行映射和转换。以下是您在 R 中的操作方法。以下函数接受一个输入词,并尝试将其与代表一个词干所有变体的模式匹配,用于您集合中的所有 n 词干。它返回一个 1 x n data.frame,其中 1 表示存在或 0 表示不存在变体匹配。

    #' Return word's stem data.frame with each column indicating presence (1) or 
    #' absence (0) of stem in that word.
    map_to_stem_df <- function(word) {
      ## named list of patterns to match
      stem_regex <- c(add = "^add[if]$", 
                      mult = "^mult[if]$")
    
      ## iterate across the stem names
      res <- lapply(names(stem_regex), function(stem) {
    
        pat <- stem_regex[stem]
        ## if pattern matches word, then 1 else 0
        if (grepl(pattern = pat, x = word))  {
          pat_match <- 1
        } else {
          pat_match <- 0  
        }
        ## create 1x1 data.frame for stem
        df <- data.frame(pat_match) 
        names(df) <- stem
        return(df)
      })
      ## bind all cols into single row data.frame 1 x length(stem_regex) & return
      data.frame(res)
    
    }
    
    map_to_stem_df("addi")
    #  add mult
    #    1    0
    
    map_to_stem_df("additional")
    # add mult
    #   0    0
    

    【讨论】:

    • 能否给我看一个解决这个问题的正则表达式代码示例?我有 210 个唯一的操作码。问题是将所有版本的相似操作码映射到同一个操作码,如上图所示。我对正则表达式如何处理这个感到有点困惑?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    相关资源
    最近更新 更多