Классификатор: морфология и диагностика

Страничка курса: https://maxcom.github.io/scala-course-2022/

"Домашнее" задание: развиваем классификатор

  • Нейтральный класс
  • Добавляем нормализацию словоформ
  • Добавляем диагностику

Нейтральный класс

Нормализация словоформ и токенизация

Игнорируем окончания у слов.

Используем готовую библиотеку - Apache Lucene


libraryDependencies += 
  "org.apache.lucene" % "lucene-analyzers-common" % "8.11.1"
					

build.sbt

Создаем анализатор:


val analyzer = new RussianAnalyzer()
					

В комплекте - токенизатор и стеммер Портера

Нам нужно достать


case class Term(word: String, start: Int, end: Int)
					

смещения понадобятся для диагностики

val ts = analyzer.tokenStream("text", "тестовая строка")
ts.reset()

val out = new ArrayBuffer[Term]

while (ts.incrementToken()) {
  val word = 
    ts.getAttribute(classOf[CharTermAttribute]).toString

  val offsets = ts.getAttribute(classOf[OffsetAttribute])

  out += Term(word, offsets.startOffset(), offsets.endOffset())
}

out // Term(тестов,0,8), Term(строк,9,15) 

Используем при классификации и при обучении.

Добавляем диагностику

3 характерных слова для найденного класса.

Выделяем слова в тексте символами '*'

Пример:


вот вам английский язык! Выучить от сих до сих! Приеду — проверю! 
Если *не* выучите — моргалы *выколю*, пасти *порву* и, 
как их, эти… носы пооткушу. Ясно?!

выделяем слова целиком, с окончаниями

Срок сдачи - 20 апреля.

Делаем новый merge request

Если первый mr еще не принят - отдельная ветка под второй