2013-11-24 3 views
0

Я делаю приложение для обработки естественного языка на Java, я использую данные из IMDB и Amazon.Заменить несколько последовательных вхождений символа с одним вхождением

Я столкнулся с определенным набором данных, который имеет такие слова, как partyyyyy. Эти слова не подходят для моего алгоритма классификации. Поэтому, я хочу их удалить и добавить party вместо partyyyyyyy.

Как я могу это сделать?

ответ

0

Этот фрагмент можно использовать довольно быстро.

public static String removeConsecutiveChars(String str) { 

     if (str == null) { 
      return null; 
     } 

     int strLen = str.length(); 
     if (strLen <= 1) { 
      return str; 
     } 

     char[] strChar = str.toCharArray(); 
     char temp = strChar[0]; 

     StringBuilder stringBuilder = new StringBuilder(strLen); 
     for (int i = 1; i < strLen; i++) { 

      char val = strChar[i]; 
      if (val != temp) { 
       stringBuilder.append(temp); 
       temp = val; 
      } 
     } 
     stringBuilder.append(temp); 

     return stringBuilder.toString(); 
    } 
2

Нет английских слов, которые, как я знаю, имеют более двух последовательных одинаковых букв.

  1. перебрать все слова
  2. Если слово имеет более чем два последовательных одинаковых букв, то:
    • Удалите все, кроме двух из повторяющихся букв, и посмотреть, если действительное слово образовано.
    • В противном случае удалите все, кроме одной повторяющейся буквы, и проверьте, создано ли действующее слово.
    • В противном случае сбой.

Такой подход не улов:

  • partyy

  • "наклоняться" (плюс это неоднозначное, что "стоп" с дополнительным "о" или просто «наклон»)

+0

«Посмотрите, действительно ли сформировано правильное слово», как я могу проверить, верно ли слово или нет? –

+0

Предположительно, у вас есть словарь, с которым вы сравниваете. Если нет, то нет! – supergra

+0

Обратите внимание, что ответ Pshemo хорош, но он не может разрешить определенные двусмысленности, такие как «stoop» vs. «stop», которые являются действительными словами! – supergra

8

Вы можете использовать регулярные выражения, чтобы найти письма, которые имеют такое же письмо после того, как, по крайней мере в два раза (так как мы не хотим, чтобы удалить правильные письма как m в comma)

String data="stoooooop partyyyyyy"; 
System.out.println(data.replaceAll("([a-zA-Z])\\1{2,}", "$1")); 
//          |  |   | 
//         group 1 match replace with 
//            from  match from group 1 
//            group 1 
//            repeated twice or more 

Выход:

stop party 
+1

спасибо, что он работал как шарм, и это тоже очень легко. –

0

Try используя петлю,

String word="Stoooppppd"; 
    StringBuilder res=new StringBuilder(); 
    char first=word.charAt(0); 
    res.append(first); 
    for (int i = 1; i < word.length(); i++) { 
     char ch=word.charAt(i); 
     if(ch!=first){ 
      res.append(ch); 
     } 
     first=ch; 
    } 
    System.out.println(res); 
+0

Да, это хороший подход, но он неправильно редактирует слова, как привет, helo ... Я не хочу этого ... Есть ли в вашем сознании какие-то другие притяжения. –

0

Вы можете использовать \ р {L} \ р {M} * вместо [A-Za-Z], чтобы включить не английские буквы Юникода, а также. Так будет: replaceAll("(\\p{L}\\p{M}*)(\\1{" + maxAllowedRepetition + ",})", "$1"); или это: replaceAll("(\\p{L}\\p{M}*)\\1{" + maxAllowedRepetition + ",}", "$1");

Смежные вопросы