НЛП: основа на наборе данных опкодов - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть набор данных из 27 файлов, каждый из которых содержит коды операций.Я хочу использовать stemming для отображения всех версий похожих кодов операций в один и тот же код операции.Например: push, pusha, pushb и т. Д. Будут сопоставлены для push;addf addi для добавления, multi multf для mult и т. д.).Как я могу это сделать?Я пытался использовать PorterStemmer с расширениями NLTK, но он не работает с моим набором данных.Я думаю, что это работает только на нормальных человеческих лингвистических словах.(Как играл, играет -> играть), а не на таких кодах операций, как (пуша, пуш -> толчок).

1 Ответ

0 голосов
/ 25 февраля 2019

Я не думаю, что стемминг - это то, что вы хотите сделать здесь.Стеммеры специфичны для языка и основаны на общих инфлективных морфологических моделях в этом языке.Например, в английском языке у вас есть бесконечные формы глаголов (например, «ходить»), которые становятся склонными для времени, аспекта и лица / числа: я иду против Она идет (прогулка + с), я иду противходил (walk + ed), также ходил + ing и т. д. Stemmers кодифицирует эти стохастические распределения в «правила», которые затем применяются к «слову» для превращения в его основание.Другими словами, для ваших кодов операций не существует готового стеммера.

У вас есть два возможных решения: (1) создать словарь или (2) написать свой собственный стеммер.Если у вас не так много вариантов для сопоставления, вероятно, проще всего создать собственный словарь, в котором вы используете все свои варианты слов в качестве ключей, а значение имеет лемма / 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
...