Как создать карту комбинаций гласных из слов в текстовом файле - PullRequest
0 голосов
/ 29 апреля 2018

Мне нужно объединить комбинации гласных слов в текстовом файле, используя Scala. Например, если текстовый файл был: «Это текстовый файл.»

На выходе будет что-то вроде (Я, 2) (А, 1) (Е, 1) (Е, 1)

Я новичок в Spark / Scala, поэтому, пожалуйста, прости мое невежество.

Мой текущий код:

val wordsFile = sc.textFile("test.txt");
val flattenMap = wordsFile.flatMap(line => line.split(" "))

Я сделал небольшую гласную функцию для проверки каждого символа, но я не уверен, как правильно ее реализовать.

def isVowel(letter: Char): Boolean = {
letter match {
case 'a' => true;
case 'e' => true;
case 'i' => true;
case 'o' => true;
case 'u' => true;
case _ => false;
}

Как мне перебрать каждое слово в flattenMap и сохранить гласные на новой карте? Спасибо.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Вот решение с использованием groupBy, которое группирует данные в соответствии с ключом, вычисленным из каждого значения данных.

val text = "This is a text file."

def vowels(s: String) = s.replaceAll("[^aeiou ]", "").sorted

text
  .trim.split("\\s+")
  .groupBy(vowels)
  .collect{ case(k, v) => (k, v.length) }

Функция vowels выделяет гласные из слова. Эта версия сортирует гласные, но не объединяет несколько экземпляров одного и того же гласного. Замените это точной операцией, которую вы хотите. Это может быть любая функция, которая извлекает важные характеристики из слова.

trim и split разбивают текст на слова, разделенные пробелами.

groupBy группирует слова в соответствии с результатом vowels.

collect преобразует список, сгенерированный groupBy в число.

Результат - Map[String, Int], но используйте toList, если вам нужно List вместо Map.

Обновление для обработки гласных в верхнем регистре

Если вам нужно обработать гласные в верхнем регистре, есть три возможных маршрута.

1) Преобразовать строку в начале

.trim.toLowerCase.split("\\s+")

Это потенциально более эффективно, но, возможно, более логично поместить правила о случае гласных в vowels check

2) Преобразовать строку в vowels

def vowels(s: String) = s.toLowerCase.replaceAll("[^aeiou ]", "").sorted

3) Добавьте прописные гласные к шаблону

def vowels(s: String) = s.replaceAll("[^AaEeIiOoUu ]", "").sorted

Это сохраняет случай гласных, которые могут или не могут быть тем, что хотели.

0 голосов
/ 29 апреля 2018

Как создать карту комбинаций гласных из слов в текстовом файле

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

val wordsFile = sc.textFile("test.txt")
val flattenMap = wordsFile
                    .flatMap(line => line.toLowerCase.replaceAll("[bcdfghjklmnpqrstvwxyz]", " ").split(" "))
                    .filter(_ != "")
                    .map((_, 1))
                    .reduceByKey(_ + _)

ПРИМЕЧАНИЕ: решение подсчитывает точную комбинацию гласных во всем тексте, поэтому вы можете изменить их в соответствии с требованиями вашей комбинации

, так что если вы вводите как

This is a text file teefie

вывод будет

(ee,1)
(e,2)
(a,1)
(i,3)
(ie,1)

Обновлено

Глядя на ожидаемый результат как

Вывод будет выглядеть примерно так: (i, 2) (a, 1) (e, 1) (ei, 1)

следующая модификация должна дать результат

val wordsFile = sc.textFile("test.txt")
val flattenMap = wordsFile.flatMap(line => line.split(" ").map(_.toLowerCase.replaceAll("[bcdfghjklmnpqrstvwxyz.,]", "").sorted))
                    .filter(_ != "")
                    .map((_, 1))
                    .reduceByKey(_ + _)

, который должен дать вам следующий вывод для ввода This is a text file.

(e,1)
(a,1)
(i,2)
(ei,1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...