[英]How to remove all stopwords from each line of string using the weka.core.Stopwords java class
[英]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.