Удаление знаков препинания из текста в Scala - Spark

Это один из примеров моих данных:

case time (especially it's purse), read manual care, follow care instructions make stays waterproof -- example, inspect rubber seals doors (especially battery/memory card door open time) 
xm "life support" picture . flip part bit flimsy guessing won't long . sound great altec speaker dock it! chance back base (xm3020) . traveling bag connect laptop extra speaker . amount paid ($25).

Я хочу удалить все знаки препинания, кроме точки (.), А также удалить слова с length < = 2Например, мой ожидаемый результат:

case time especially its purse read manual care follow care instructions . make stays waterproof example inspect rubber seals doors especially batterymemory card door open time
life support picture . flip part bit flimsy guessing wont long . sound great altec speaker dock chance back base xm3020 . traveling bag connect laptop extra speaker . amount paid $25 .

и это должно быть реализовано в Scala, я пробовал:

replaceAll( """\\W\s""", "")
replaceAll(""""[^a-zA-Z\.]""", "")

но не работает, кто-нибудь может мне помочь?

4 ответа

Решение

Глядя на регулярное выражение Javadoc ( http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html), мы видим, что класс символов для пунктуации \p{Punct} и что мы можем удалить символ из класса символов, используя что-то как [a-z&&[^def]], С этого момента легко определить регулярное выражение, которое удалит все знаки препинания, кроме точки:

s.replaceAll("""[\p{Punct}&&[^.]]""", "")

Удаление слов размером <= 2 можно сделать так:

s.replaceAll("""\b\p{IsLetter}{1,2}\b""")

Объединяя два, это дает:

s.replaceAll("""([\p{Punct}&&[^.]]|\b\p{IsLetter}{1,2}\b)\s*""", "")

Обратите внимание, как я добавил \s* удалить лишние пробелы.

Кроме того, вы можете видеть, что приведенное выше регулярное выражение полностью удаляет '$', потому что это символ пунктуации (как определено в Юникоде). Если это нежелательно (как, по-видимому, указывает на ожидаемый результат), просьба быть более точной в том, что вы считаете пунктуацией. В качестве примера вы можете рассматривать только следующие символы в качестве знаков препинания: ?.!:():

s.replaceAll("""([?.!:]|\b\p{IsLetter}{1,2}\b)\s*""", "")

В качестве альтернативы, вы можете просто добавить '$' в свой список символов без пунктуации вместе с точкой:

s.replaceAll("""([\p{Punct}&&[^.$]]|\b\p{IsLetter}{1,2}\b)\s*""", "")

Как насчет этого:

replaceAll("(\\(|\\)|'|/", "")

Затем вы просто добавляете больше знаков препинания для удаления, используя |, и обязательно экранируете символы, такие как (и), с двойной обратной косой чертой?

Вы можете попробовать отфильтровать строку следующим образом:

val example = "Hey there! It's me, myself and I."
example.filterNot(x => x == ',' || x == '!' || x == 'm')
 res3: String = Hey there It's e yself and I.

Попробуйте это, это будет работать:

val str = """
  |case time (especially it's purse), read manual care, follow care instructions make stays waterproof -- example, inspect rubber seals doors (especially battery/memory card door open time) 
  |xm "life support" picture . flip part bit flimsy guessing won't long . sound great altec speaker dock it! chance back base (xm3020) . traveling bag connect laptop extra speaker . amount paid ($25).
  """.stripMargin('|')

println(str)
val pat = """[^\w\s\.\$]"""
val pat2 = """\s\w{2}\s"""
println(str.replaceAll(pat, "").replaceAll(pat2, ""))

ВЫХОД:

case time especially its purse read manual care follow care instructions make stays waterproof  example inspect rubber seals doors especially batterymemory card door open time 
life support picture . flip part bit flimsy guessing wont long . sound great altec speaker dockchance back base xm3020 . traveling bag connect laptop extra speaker . amount paid $25.
Другие вопросы по тегам