从Java中删除字符串中的停用词

时间:2014-04-21 22:12:20

标签: java regex stop-words

我有一个包含很多单词的字符串,我需要计算。

但我想避免使用一些没有显着背景的词语。

所以,我有一个文件,其中包含我将忽略的所有单词。我打开这个文件并创建一个我打电话的列表

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;。

3 个答案:

答案 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单词

exude library

相关问题