我使用此link中提供的OpenNLP解析器代码解析了该文档,并得到以下输出:
(TOP (S (NP (NN Programcreek)) (VP (VBZ is) (NP (DT a) (ADJP (RB very) (JJ huge) (CC and) (JJ useful)) (NN website)))))
由此我想提取有意义的单词,这意味着我想删除所有的停用词,因为我想根据这些有意义的单词进一步进行分类。你能告诉我如何从解析的输出中删除停用词吗?
最后我想得到以下输出
(TOP (S (NP (NN Programcreek)) (JJ useful)) (NN website)))))
请帮助我,如果OpenNLP不可能,那么建议我使用任何其他Java库进行自然语言处理。因为我的主要目的是解析文档并仅获得有意义的单词。
答案 0 :(得分:5)
似乎OpenNLP不支持此功能。你必须这样做,因为Olena Vikariy自己建议并实现它,或者像Mallet一样在Java中使用不同的NLP库。
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("");
您可以使用this list英语停用词。
或者使用Mallet,您必须遵循教程here。 为此目的,使用管道定义了删除停用词的部分:
pipeList.add(new TokenSequenceRemoveStopwords(false, false));
Mallet包含停用词列表,因此您无需定义它们,但如果需要,也可以进行扩展。
希望这有帮助。
答案 1 :(得分:2)
您可以在将文本传递给OpenNLP之前轻松删除文本中的所有停用词。
以下是如何在.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;
}