我正在使用Java编写自然语言处理应用程序,我正在使用来自IMDB和亚马逊的数据。
我遇到了某个数据集,其中包含partyyyyy
等字词。这些词对我的分类算法不利。因此,我想删除它们并添加party
而不是partyyyyyyy
。
我该怎么做?
答案 0 :(得分:10)
您可以使用正则表达式在其后至少两次查找具有相同字母的字母(因为我们不想在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 :(得分:2)
我所知道的英语单词不止两个以上相同的字母。
这种方法不捕获:
partyy
“stoop”(加上那个含糊不清!是“停止”加一个额外的“o”还是简单地“弯腰”)
答案 2 :(得分:1)
尝试使用循环,
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);
答案 3 :(得分:0)
您可能希望使用\ p {L} \ p {M} *而不是[a-zA-Z]来包含非英语的unicode字母。所以它会是这样的:replaceAll("(\\p{L}\\p{M}*)(\\1{" + maxAllowedRepetition + ",})", "$1");
或者:replaceAll("(\\p{L}\\p{M}*)\\1{" + maxAllowedRepetition + ",}", "$1");
答案 4 :(得分: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();
}