【问题标题】:Remove stopwords from a string in Java从Java中的字符串中删除停用词
【发布时间】:2014-06-06 01:54:34
【问题描述】:

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

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

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

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 + " ", " ");
}

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

“Job 软件工厂。Work Agile、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”并让我保持“initial”。

【问题讨论】:

  • 您可以将正则表达式与前瞻和后视一起使用。或者标记您的文本,删除停用词并将标记重新组合成一个连续的字符串。
  • 需要保留标点符号吗?
  • 我尝试使用 StringTokenizer,但它会将单词与标点符号分开,然后我又回到了同样的问题。什么是“单词”或“单词”的正则表达式,后跟标点符号,例如“单词”。或“单词”或“单词:”?
  • 是的@ArunAllamsetty。我需要保留标点符号。我无法删除它。

标签: java regex stop-words


【解决方案1】:

看起来你只想替换两边都有非单词字符的单词。对此进行前瞻和后瞻是非常简单的。

双空格、句号后面的逗号和类似的东西可能存在问题,但听起来这与您的应用程序无关,如果是这样,您如何解决这个问题也存在一些歧义.

类似的东西应该可以工作:

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:]])", "")

【讨论】:

  • 我在我的代码中复制了您的解决方案,但没有删除任何内容。
  • @MariaH:正则表达式是错误的,因为^ 必须进入[]。如果您关心速度(通常不应该),请查看我的解决方案。
  • 所以...应该是:example = example.replaceAll("(?![^a-zA-Z])" + stopWord + "(?=[^a-zA-Z ])"、"")。我会通过这样做删除标点符号吗?我不能那样做! :\
  • 啊抱歉,克拉完全是放在括号里的。 @MariaH,不,这不会删除标点符号。由于这些是前瞻和后瞻,它们实际上与所讨论的标点符号不匹配。
  • @SlaterTyranus 非常感谢您的帮助!你的解决方案很好!但对我来说有一个问题。你看,我正在使用葡萄牙语。有一些像“aplicações”这样带有特殊字符的词。由于 'a' 在我的 stopWordsList 中,replaceAll 之后这个词变成了“aplicções”。为了避免这个问题,我需要做些什么改变?
【解决方案2】:

最简单的方法是沿单词边界拆分字符串,然后添加除停用词以外的所有内容。

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

【讨论】:

  • 使用 example.split("\\b")result.append(s + " ") 为我工作。
猜你喜欢
  • 2015-02-25
  • 1970-01-01
  • 2013-12-16
  • 2014-05-22
  • 1970-01-01
  • 2019-12-18
  • 2016-10-06
  • 2015-09-11
相关资源
最近更新 更多