Удаление дефисов в http, но сохранение дефисных слов в корпусе

Я пытаюсь модифицировать функцию определения основы, которая может 1) удалять дефисы в http (которые появились в корпусе), но при этом 2) сохранять дефисы, которые появляются в значимых дефисных выражениях (например, отнимающих много времени, непомерно дорогих, и т.д.). На самом деле я задавал подобные вопросы несколько месяцев назад на другом ветка вопросов, код выглядит так:

# load stringr to use str_replace_all
require(stringr)

clean.text = function(x)
{
  # remove rt
  x = gsub("rt ", "", x)
  # remove at
  x = gsub("@\\w+", "", x)
  x = gsub("[[:punct:]]", "", x)
  x = gsub("[[:digit:]]", "", x)
  # remove http
  x = gsub("http\\w+", "", x)
  x = gsub("[ |\t]{2,}", "", x)
  x = gsub("^ ", "", x)
  x = gsub(" $", "", x)
  x = str_replace_all(x, "[^[:alnum:][:space:]'-]", " ")
  #return(x)
}

# example
my_text <- "accident-prone"
new_text <- clean.text(text)
new_text
[1] "accidentprone"

но не смог получить удовлетворительного ответа, затем переключил свое внимание на другие проекты, пока не возобновил работу над этим. Похоже, что "[^[:alnum:][:space:]'-]" в последней строке блока кода является виновником удаления - из не-http части корпуса.

Я не мог понять, как добиться желаемых результатов, буду очень признателен, если кто-то может поделиться своим мнением по этому поводу.


person Chris T.    schedule 05.10.2018    source источник
comment
Попробуйте заменить str_replace_all(x, "[^[:alnum:][:space:]'-]", " ") на gsub("\\b-\\b(*SKIP)(*F)|[^[:alnum:][:space:]'-]", " ", x, perl=TRUE) или, чтобы сохранить шаблон Unicode, gsub("(*UCP)\\b-\\b(*SKIP)(*F)|[^\\w\\s'-]|_", " ", x, perl=TRUE)   -  person Wiktor Stribiżew    schedule 05.10.2018
comment
Это все еще дает тот же результат.   -  person Chris T.    schedule 05.10.2018
comment
Хорошо, замените x = gsub("[[:punct:]]", "", x) на x = gsub("(?!-)[[:punct:]]", "", x, perl=TRUE). Обратите внимание, что вы все равно можете избавиться от stringr, заменив строку str_replace на x = gsub("[^[:alnum:][:space:]'-]", " ", x)   -  person Wiktor Stribiżew    schedule 05.10.2018


Ответы (1)


Фактическим виновником является шаблон удаления [[:punct:]], поскольку он соответствует - в любом месте строки.

Вы можете использовать

clean.text <- function(x)
{
  # remove rt
  x <- gsub("rt\\s", "", x)
  # remove at
  x <- gsub("@\\w+", "", x)
  x <- gsub("\\b-\\b(*SKIP)(*F)|[[:punct:]]", "", x, perl=TRUE)
  x <- gsub("[[:digit:]]+", "", x)
  # remove http
  x <- gsub("http\\w+", "", x)
  x <- gsub("\\h{2,}", "", x, perl=TRUE)
  x <- trimws(x)
  x <- gsub("[^[:alnum:][:space:]'-]", " ", x)
  return(x)
}

Затем,

my_text <- "  accident-prone  http://www.some.com  rt "
new_text <- clean.text(my_text)
new_text 
## => [1] "accident-prone"

См. демонстрацию R.

Примечание:

  • x = gsub("^ ", "", x) и x = gsub(" $", "", x) можно заменить на trimws(x)
  • gsub("\\b-\\b(*SKIP)(*F)|[[:punct:]]", "", x, perl=TRUE) удаляет все знаки препинания, НО дефисы между символами слов (вы можете изменить это в части перед (*SKIP)(*F))
  • gsub("[^[:alnum:][:space:]'-]", " ", x) — базовый эквивалент R для str_replace_all(x, "[^[:alnum:][:space:]'-]", " ").
  • gsub("\\h{2,}", "", x, perl=TRUE) удалите любые 2 или более горизонтальных пробела. Если под "[ |\t]{2,}" вы имели в виду любые 2 или более пробелов, используйте здесь \\s вместо \\h.
person Wiktor Stribiżew    schedule 05.10.2018
comment
Большое спасибо за это очень подробное объяснение! Я буду читать больше на gsub. - person Chris T.; 05.10.2018