НЛП: основа на наборе данных опкодов

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

1 ответ

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

У вас есть два возможных решения: (1) создать словарь или (2) написать свой собственный стеммер. Если у вас не так много вариантов для сопоставления, вероятно, проще всего создать собственный словарь, в котором вы используете все свои варианты слов в качестве ключей, а значение имеет лемма /stem/canonical-form.

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

Если ваши потенциальные отображения слишком многочисленны, чтобы их можно было сделать вручную, тогда вы можете написать пользовательский модуль регулярных выражений для выполнения преобразования и преобразования. Вот как вы можете сделать это в R. Следующая функция берет входное слово и пытается сопоставить его с шаблоном, представляющим все варианты основы, для всех n стебли в вашей коллекции. Возвращает 1 х 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
Другие вопросы по тегам