J'ai une chaîne avec beaucoup de mots et un fichier texte qui contient des mots d'arrêt que je dois supprimer de ma chaîne. Disons que j'ai une ficelle
s="I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs."
Après avoir supprimé les mots vides, la chaîne devrait ressembler à:
"love phone, super fast much cool Jelly bean....but recently bugs."
J'ai pu atteindre cet objectif, mais le problème auquel je suis confronté est que lorsqu'il y a des mots vides adjacents dans la chaîne, il ne supprime que le premier et le résultat obtenu est le suivant:
"love phone, super fast there's much and cool with Jelly bean....but recently seen bugs"
Voici mon fichier stopwordslist.txt: Stopwords
Comment puis-je résoudre ce problème. Voici ce que j'ai fait jusqu'à présent:
int k=0,i,j;
ArrayList<String> wordsList = new ArrayList<String>();
String sCurrentLine;
String[] stopwords = new String[2000];
try{
FileReader fr=new FileReader("F:\\stopwordslist.txt");
BufferedReader br= new BufferedReader(fr);
while ((sCurrentLine = br.readLine()) != null){
stopwords[k]=sCurrentLine;
k++;
}
String s="I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs.";
StringBuilder builder = new StringBuilder(s);
String[] words = builder.toString().split("\\s");
for (String Word : words){
wordsList.add(Word);
}
for(int ii = 0; ii < wordsList.size(); ii++){
for(int jj = 0; jj < k; jj++){
if(stopwords[jj].contains(wordsList.get(ii).toLowerCase())){
wordsList.remove(ii);
break;
}
}
}
for (String str : wordsList){
System.out.print(str+" ");
}
}catch(Exception ex){
System.out.println(ex);
}
L'erreur est due au fait que vous supprimez un élément de la liste sur laquelle vous parcourez. Disons que vous avez wordsList
qui contient |Word0|Word1|Word2|
Si ii
est égal à 1
et que si test est vrai, vous appelez wordsList.remove(1);
. Après cela, votre liste est |Word0|Word2|
. ii
est alors incrémenté et est égal à 2
et maintenant il dépasse la taille de votre liste, par conséquent Word2
ne sera jamais testé.
De là, il y a plusieurs solutions. Par exemple, au lieu de supprimer des valeurs, vous pouvez définir la valeur sur "". Ou créez une liste spéciale de "résultats".
Essayez le programme ci-dessous.
String s="I love this phone, its super fast and there's so" +
" much new and cool things with Jelly bean....but of recently I've seen some bugs.";
String[] words = s.split(" ");
ArrayList<String> wordsList = new ArrayList<String>();
Set<String> stopWordsSet = new HashSet<String>();
stopWordsSet.add("I");
stopWordsSet.add("THIS");
stopWordsSet.add("AND");
stopWordsSet.add("THERE'S");
for(String Word : words)
{
String wordCompare = Word.toUpperCase();
if(!stopWordsSet.contains(wordCompare))
{
wordsList.add(Word);
}
}
for (String str : wordsList){
System.out.print(str+" ");
}
SORTIE: Love phone, c'est super rapide et plein de nouvelles choses sympas avec Jelly Bean ... mais récemment, j'ai vu des bugs.
C'est une solution beaucoup plus élégante (IMHO), utilisant uniquement des expressions régulières:
// instead of the ".....", add all your stopwords, separated by "|"
// "\\b" is to account for Word boundaries, i.e. not replace "his" in "this"
// the "\\s?" is to suppress optional trailing white space
Pattern p = Pattern.compile("\\b(I|this|its.....)\\b\\s?");
Matcher m = p.matcher("I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs.");
String s = m.replaceAll("");
System.out.println(s);
Vous pouvez utiliser la fonction Remplacer tout comme ceci
String yourString ="I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs."
yourString=yourString.replaceAll("stop" ,"");
Voici l'essayer de la manière suivante:
String s="I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs.";
String stopWords[]={"love","this","cool"};
for(int i=0;i<stopWords.length;i++){
if(s.contains(stopWords[i])){
s=s.replaceAll(stopWords[i]+"\\s+", ""); //note this will remove spaces at the end
}
}
System.out.println(s);
De cette façon, votre sortie finale sera sans les mots que vous ne voulez pas. Il suffit d’obtenir une liste de mots vides dans un tableau et de les remplacer dans la chaîne requise.
Sortie pour mes mots vides:
I phone, its super fast and there's so much new and things with Jelly bean....but of recently I've seen some bugs.
Pourquoi n'utilisez-vous pas l'approche ci-dessous? Ce sera plus facile à lire et à comprendre:
for(String Word : words){
s = s.replace(Word+"\\s*", "");
}
System.out.println(s);//It will print removed Word string.
Récemment, l’un des projets avait besoin de la fonctionnalité pour filtrer les mots stopp/stopp et jure du texte ou du fichier donné, après avoir parcouru les quelques blogs et articles rédigés. A créé une simple bibliothèque pour filtrer les données/fichiers et mis à disposition en maven. espérons que cela pourra aider quelqu'un.
https://github.com/uttesh/exude
<dependency>
<groupId>com.uttesh</groupId>
<artifactId>exude</artifactId>
<version>0.0.2</version>
</dependency>
Il semble que vous fassiez un arrêt d'un trait. Word est supprimé d'une phrase. Déplacez-le vers un autre mot d'arrêt: vous devez supprimer tous les mots vides de chaque phrase.
Vous devriez essayer de changer votre code:
for(int ii = 0; ii < wordsList.size(); ii++){
for(int jj = 0; jj < k; jj++){
if(stopwords[jj].contains(wordsList.get(ii).toLowerCase())){
wordsList.remove(ii);
break;
}
}
}
for(int ii = 0; ii < wordsList.size(); ii++)
{
for(int jj = 0; jj < k; jj++)
{
if(wordsList.get(ii).toLowerCase().contains(stopwords[jj])
{
wordsList.remove(ii);
}
}
}
Notez que break
est supprimé et que stopword.contains(Word)
est remplacé par Word.contains(stopword)
.
Essayez d’utiliser replaceAll api de String comme ceci:
String myString = "I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs.";
String stopWords = "I|its|with|but";
String afterStopWords = myString.replaceAll("(" + stopWords + ")\\s*", "");
System.out.println(afterStopWords);
OUTPUT:
love this phone, super fast and there's so much new and cool things Jelly bean....of recently 've seen some bugs.
Essayez de stocker les mots vides dans une collection d'ensembles, puis marquez votre chaîne dans une liste. Vous pouvez ensuite simplement utiliser 'removeAll' pour obtenir le résultat.
Set<String> stopwords = new Set<>()
//fill in the set with your file
String s="I love this phone, its super fast and there's so much new and cool things with Jelly bean....but of recently I've seen some bugs.";
List<String> listOfStrings = asList(s.split(" "));
listOfStrings.removeAll(stopwords);
StringUtils.join(listOfStrings, " ");
Pas de boucles nécessaires - elles signifient généralement des problèmes.