Как оптимизировать очистку твиттер-текстов? - PullRequest
1 голос
/ 19 февраля 2020

Как мне переписать функцию очистки текста и сделать ее более эффективной?

import com.ibm.icu.text.Normalizer2

// A whitespace character: [ \t\n\x0B\f\r]
private val whiteSpaceRegex = "\\p{Space}"
// Any except letter (subtraction)
private val exceptLetterRegex = "[^\\p{L}]"

val normalize = (str: String) => Normalizer2.getNFKCCasefoldInstance.normalize(str)

val cleanse = (str: String) => normalize(str) // 1
  .toLowerCase // 2
  .split(whiteSpaceRegex) // 3
  .filterNot( // 4
    p => p.startsWith("@") || p.startsWith("/") || p.startsWith("http") || p.startsWith("www")
  ).mkString(" ") // 5
  .replaceAll("-", "") // 6
  .replaceAll(exceptLetterRegex, " ") // 7
  .replaceAll("\\s{2,}", " ") // 8
  .trim // 9
  1. нормализовать буквы в строке
  2. изменить строку в нижний регистр
  3. разбить строку в массив [String] по пробелам
  4. отфильтровать специфичные для Twitter c слова: ссылки, псевдонимы
  5. сделать строку снова
  6. склеить слова с дефисом (например, : бывшая жена - бывшая жена)
  7. заменить все, кроме букв пробелом
  8. заменить несколько пробелов на один
  9. удалить первый и последний пробел

Тесты:

val strMultiLine =
  """RT @digger: Что-то пиддес52 :|
и так скучать( HERE_HTTP_T_DOT_CO_LINK что,я +100500 surf cвихнусь так D:"""

val res1 = "rt чтото пиддес и так скучать что я surf cвихнусь так d"

cleanse(strMultiLine) must equal(res1)

val strWithLineBreak =
  "Говорит: \"\"Кто то в углу сидит))) и погибает от голода!!! мы,хотя уже сидим из-за\"\" :DD …"

val res2 = "говорит кто то в углу сидит и погибает от голода мы хотя уже сидим изза dd"

cleanse(strWithLineBreak) must equal(res2)
  • HERE_HTTP_T_DOT_CO_LINK - Stackoverflow попросил меня удалить ссылку из текста

1 Ответ

1 голос
/ 20 февраля 2020

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

val cleanse2 = (str: String) => normalize(str)                  // Normalize
      .replace("-","")                                          // Remove -
      .replaceAll("""(?<!\S)(?:[@/]|http|www)\S*|\P{L}""", " ") // Remove entities
      .replaceAll("""\s{2,}""", " ")                            // Shrink whitespaces
      .trim                                                     // Trim the result
      .toLowerCase                                              // To lower case

См. Демонстрационную версию регулярных выражений .

Шаблон (?<!\S)(?:[@/]|http|www)\S*|\P{L} соответствует

  • (?<!\S) - пробел или начало строки должны предшествовать текущей позиции немедленно
  • (?:[@/]|http|www)\S* - @, /, http или www, а затем любые 0+ непробельных символов
  • | - или
  • \P{L} - любые буква char.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...