使用OpenNLP从解析的内容中删除停用词

use*_*214 5 java nlp stop-words opennlp

我已经使用此链接中提供的OpenNLP解析器代码解析了文档,并且得到了以下输出:

(TOP (S (NP (NN Programcreek)) (VP (VBZ is) (NP (DT a) (ADJP (RB very) (JJ huge) (CC and) (JJ useful)) (NN website)))))
Run Code Online (Sandbox Code Playgroud)

我只想从中提取有意义的词,这意味着我想删除所有停用词,因为我想进一步根据这些有意义的词进行分类。您能否建议我如何从解析的输出中删除停用词?

最后我想得到以下输出

   (TOP (S (NP (NN Programcreek)) (JJ useful)) (NN website)))))
Run Code Online (Sandbox Code Playgroud)

请帮助我,如果OpenNLP无法实现,那么建议我使用其他任何Java库进行自然语言处理。因为我的主要目的是解析文档并仅获取有意义的单词。

c-c*_*vez 5

似乎OpenNLP不支持此功能。您将必须按照Olena Vikariy的建议自己完成并实施,或者在Java中使用其他不同的NLP库(例如Mallet)。

以下是Java中用于删除停用词的实现(不需要排序):

String testText = "This is a text you want to test";
String[] stopWords = new String[]{"a", "able", "about", "above", "according", "accordingly", "across", "actually", "after", "afterwards", "again", "against", "all"};
String stopWordsPattern = String.join("|", stopWords);
Pattern pattern = Pattern.compile("\\b(?:" + stopWordsPattern + ")\\b\\s*", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(testText);
testText = matcher.replaceAll("");
Run Code Online (Sandbox Code Playgroud)

您可以使用英语停用词列表

或者使用Mallet,您将必须按照这里的指南进行操作。为此,使用管道定义了删除停用词的部分:

pipeList.add(new TokenSequenceRemoveStopwords(false, false));
Run Code Online (Sandbox Code Playgroud)

Mallet包含一个停用词列表,因此您无需定义它们,但也可以在需要时进行扩展。

希望这可以帮助。


小智 3

在将文本传递给 OpenNLP 之前,您可以轻松地从文本中删除所有停用词。

  1. 将停用词存储在数组中
  2. 按字长对数组进行排序,以避免出现诸如删除“did”之前的“didn't”并最终得到“n't”等问题
  3. 使用正则表达式删除所有单词,确保忽略大小写并仅删除整个单词

以下是在 .NET 中执行此操作的方法,您可以将其应用到 Java 中。

public string CleanStopWords(string inputText)
{
    string[] stopWords = new string[] { 
        "a", "all", "am", "an", "and", "any", "are", "aren't", 
        "as", "at", "be", "because", "been", "to", "from", "by", 
        "can", "can't", "do", "don't", "didn't", "did" };

    stopWords = stopWords.OrderByDescending(w => w.Length).ToArray();

    string outputText = Regex.Replace(inputText, "\\b" + string.Join("\\b|\\b", stopWords) + "\\b", "", RegexOptions.IgnoreCase);

    return outputText;
}
Run Code Online (Sandbox Code Playgroud)