繁体   English   中英

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

[英]Remove stopwords from a string in Java

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

但我想避免一些对上下文没有意义的词。

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

ArrayList<String> stopWordsList;

现在我有了字符串,需要清理它,从列表中删除停用词。

我试过这样:

String example = "Job in a software factory. Work with Agile, Spring, Hibernate, GWT, etc.";

for(String stopWord : stopWordsList){
    example = example.replaceAll(" "+ stopWord + " ", " ");
}

在此之后,字符串示例应该是:

“工作软件工厂。工作敏捷,Spring,Hibernate,GWT,。”

问题是“等”。 没有删除它,因为单词后面的点。

然后我尝试:

for(String stopWord : stopWordsList){
    example = example.replaceAll(" "+ stopWord + " ", " ");    
    example = example.replaceAll(" "+ stopWord + ",", ",");     
    example = example.replaceAll(" "+ stopWord + ".", ".");
}

但是,这是不对的,它不能满足我的需求。

任何人都可以帮我找到一种方法来清理这个字符串,包括标点符号或空格之前的单词。

PS:我不能只做

 example = example.replaceAll(stopWord, " ");   

因为这可以打破一些像“初始”这样的词。 它将删除“in”并让我“itial”。

最简单的方法可能是将String沿单词边界分割,然后添加除停用词以外的所有内容。

StringBuilder result = new StringBuilder(example.length());
for (String s : result.split("\\b")) {
    if (!stopWordsSet.contains(s)) result.append(s);
}

看起来您只想在单词的两边都包含非单词字符时替换该单词。 为此既要先行又要先行是很简单的。

诸如双倍空格,句点之后的逗号以及沿这些界线的东西等可能存在问题,但这听起来与您的应用程序无关,如果解决的话,这会有些含糊。

与此类似的东西应该起作用:

example = example.replaceAll("(?![^ a-zA-Z])" + stopWord + "(?=[^ a-zA-Z])", "")

其中(?![^ a-zA-Z])是对否定的否定项(向后看),既不是空格也不是字符,而(?=[^ a-zA-Z])是前瞻性等效项。

希望有帮助,如果您还有其他问题,或者这对您的应用程序不理想,请让我知道。

这不会删除标点符号。 由于这些是先行和后退,因此它们实际上与所讨论的标点不匹配。

如果您还希望它也使用重音符号,则可以用兼容POSIX的[:alpha:]代替传统的\\w正则表达式。

example = example.replaceAll("(?![^ [:alpha:]])" + stopWord + "(?=[^ [:alpha:]])", "")

创建了一个小型util库,以从给定文本及其在Maven存储库/ github中删除停用词/词尾

散发图书馆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM