我有一个包含很多单词的字符串,我需要计算。
但我想避免使用一些没有显着背景的词语。
所以,我有一个文件,其中包含我将忽略的所有单词。我打开这个文件并创建一个我打电话的列表
ArrayList<String> stopWordsList;
现在我有了字符串,需要清理它,从列表中删除了stopWords。
我试过这样的事:
String example = "Job in a software factory. Work with Agile, Spring, Hibernate, GWT, etc.";
for(String stopWord : stopWordsList){
example = example.replaceAll(" "+ stopWord + " ", " ");
}
在此之后,字符串示例应为:
&#34;工作软件工厂。工作敏捷,Spring,Hibernate,GWT,。&#34;
问题是&#34;等等&#34;没有删除它,因为这个词后面的点。
然后我尝试了:
for(String stopWord : stopWordsList){
example = example.replaceAll(" "+ stopWord + " ", " ");
example = example.replaceAll(" "+ stopWord + ",", ",");
example = example.replaceAll(" "+ stopWord + ".", ".");
}
但是,这不对,它不能满足我的需要。
任何人都可以帮我找到一种方法来清理这个字符串,包括在标点符号或空白字符之前出现的单词。
PS:我不能做到
example = example.replaceAll(stopWord, " ");
因为这可能会打破像#&#34; initial&#34;这样的词。它将删除&#34; in&#34;离开我&#34; itial&#34;。
答案 0 :(得分:3)
最简单的方法是将字符串沿着字边界分开并添加所有内容,但不要停止单词。
StringBuilder result = new StringBuilder(example.length());
for (String s : result.split("\\b")) {
if (!stopWordsSet.contains(s)) result.append(s);
}
答案 1 :(得分:0)
看起来你只想在双方都有非单词字符时替换单词。对于这一点而言,只有前瞻和后视都非常简单。
像双倍空间这样的东西可能会出现问题,而且在这些行之后会出现逗号,但这听起来并不像是与您的应用程序相关,如果它存在一些歧义,你可以解决这个问题。
有些事情应该有效:
example = example.replaceAll("(?![^ a-zA-Z])" + stopWord + "(?=[^ a-zA-Z])", "")
(?![^ a-zA-Z])
对于任何既不是空格也不是字符的东西都是负前瞻(后面看),(?=[^ a-zA-Z])
是前瞻性的等价物。
希望有所帮助,如果您有任何其他问题,请告诉我,或者这对您的申请来说是不理想的。
这不会删除标点符号。由于这些是前瞻和后视,它们实际上并不符合所讨论的标点符号。
如果您希望这也适用于重音字符,则可以将传统的\w
正则表达式替换为符合POSIX的[:alpha:]
。
example = example.replaceAll("(?![^ [:alpha:]])" + stopWord + "(?=[^ [:alpha:]])", "")
答案 2 :(得分:0)
创建一个小的util库,从给定的文本及其maven repository / github中删除stop / stemmer单词