Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中从字符串中删除停止字_Java_Regex_Stop Words - Fatal编程技术网

在Java中从字符串中删除停止字

在Java中从字符串中删除停止字,java,regex,stop-words,Java,Regex,Stop Words,我有一个字符串,里面有很多我需要数数的单词 但我想避免使用一些对上下文没有意义的词语 所以,我有一个文件,里面有我将忽略的所有单词。我打开这个文件并创建一个我调用的列表 ArrayList<String> stopWordsList; 在此之后,字符串示例应为: “Job软件工厂。敏捷工作,Spring,Hibernate,GWT,” 问题是“etc”没有删除它,因为单词后面有点 然后我试着: for(String stopWord : stopWordsList){ ex

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

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

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

ArrayList<String> stopWordsList;
在此之后,字符串示例应为:

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

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

然后我试着:

for(String stopWord : stopWordsList){
    example = example.replaceAll(" "+ stopWord + " ", " ");    
    example = example.replaceAll(" "+ stopWord + ",", ",");     
    example = example.replaceAll(" "+ stopWord + ".", ".");
}
但是,这是不对的,它不能满足我的需要

有谁能帮我找到一种方法来清理这个字符串,包括标点或空格之前的单词

附言:我不能就这么做

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

因为这会打断一些单词,比如“initial”。它将删除“in”,并将我保留为“initial”。

看起来您只是想替换两边都有非单词字符的单词。这是非常简单的,只是有一个前瞻性和前瞻性的这一点

像双空格、句点后的逗号以及类似于这些行的东西可能会有问题,但这听起来与您的应用程序无关,如果是这样的话,在如何解决这个问题上存在一些模糊性

这样做应该会奏效:

example = example.replaceAll("(?![^ a-zA-Z])" + stopWord + "(?=[^ a-zA-Z])", "")
其中,
(?![^a-zA-Z])
是对既不是空格也不是字符的任何事物的负向前看(向后看),而
(?=[^a-zA-Z])
是向前看的等价物

希望这能有所帮助,如果您还有任何问题,或者这不适合您的申请,请告诉我

这不会删除标点符号。因为它们是lookahead和lookbehind,所以它们实际上与所讨论的标点符号不匹配

如果您想让它也适用于重音字符,您可以用符合POSIX的
[:alpha://code>替换传统的
\w
正则表达式

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

最简单的方法可能是沿着单词边界分割字符串,并添加除了停止词以外的所有内容

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

您可以将regex与lookahead和lookahead一起使用。或者将文本标记化,删除停止字并将标记重新组合为连续字符串。是否需要保留标点符号?我尝试使用StringTokenizer,但它会将单词与标点符号一起拆分,然后返回到相同的问题。“word”或“word”的正则表达式是什么,后面有标点符号,如“word.”或“word”或“word:”?Yes@Arunallamsety。我需要保留标点符号。我无法删除它。我在代码中复制了您的解决方案,但没有删除任何内容。@MariaH:regex是错误的,因为
^
必须进入
[]
。如果你关心速度(通常你不应该),看看我的解决方案。所以。。。它应该是:example=example.replaceAll((?![^a-zA-Z])“+stopWord+”(?=[^a-zA-Z]),“”)。我会这样做来删除标点符号吗?我不能那样做\啊,对不起,克拉完全是放在括号里的@玛丽亚,不,这不会删除标点符号。由于这些是lookaheads和lookbehinds,它们实际上与所讨论的标点符号不匹配。@SlaterTyranus非常感谢您的帮助!你的解决方案很好!但对我来说有个问题。你看,我在用葡萄牙语工作。有些单词像“aplicaõões”带有特殊的字符。由于“a”在我的stopWordsList中,在替换之后,所有这些单词都变成了“aplicõões”。我需要做什么更改来避免这个问题?使用
示例.split(\\b“)
结果.append(s+)
对我很有效。
StringBuilder result = new StringBuilder(example.length());
for (String s : result.split("\\b")) {
    if (!stopWordsSet.contains(s)) result.append(s);
}