【问题标题】:What is the efficient way to drop stop words (e.g., of a the etc.) from a text using Java使用Java从文本中删除停用词(例如,等)的有效方法是什么
【发布时间】:2014-07-16 20:04:30
【问题描述】:

在使用基于 JAVA 的文档分类器(例如 OpenNLP)等之前,有没有办法删除停用词(例如,'of' 'a' 'the' 等)。或者如果您自己做(使用 JAVA )什么可能是最有效的方法(鉴于字符串比较效率低下)。此外,鉴于每个文档本身并没有那么大,即平均大约 100 个单词,但假设文档的数量很大。

E.g., 
// Populate the stop words to a list
List<String> stopWordsList = ArrayList<>();

// Iterate through a list of documents
String currentDoc = getCurrentDoc();

String[] wordsArray = currentDoc.split(" ");    

 for ( String word : wordsArray ) {

      if (stopWordsList.contains(word)){
           // Drop it
      }
  }

【问题讨论】:

    标签: java performance nlp opennlp


    【解决方案1】:

    你的技术很好。但是,您应该将 stopWordsList 设置为 Set,而不是 List,以便您可以在恒定时间而不是线性时间中查找内容。换句话说,您不想查看整个 stopWordsList 以查看 word 是否在其中;您想立即查看它是否在集合中。

    【讨论】:

      【解决方案2】:

      你可以试试下面的代码:

          String sentence = "This is a sample sentence for testing stop word deletion";
      
          String pattern = " a | the | for | is ";
          sentence = sentence.replaceAll(pattern, " ");
      

      结果:这个例句测试停用词删除

      该模式包含由管道分隔的所有停用词,表示该模式可能包含其中任何一个。请记住在停用词周围留有空格,以将它们区分为确切的单词。如果不是空格,它将替换所有出现的停用词字符组合,即使在单词中也是如此。

      【讨论】:

      • 停用词可以是大写/小写,如果停用词没有包含在两个空格之间,则您的模式不起作用,如果句子以停用词开头或结尾可能就是这种情况, 或者如果后跟逗号等...
      • 注明。但是上面提到的大部分问题都可以通过适当的正则表达式模式或一系列正则表达式模式来解决。
      【解决方案3】:

      无需拆分,只需将目标字符串替换为空字符串即可

      String currentDoc = getCurrentDoc();
      currentDoc = currentDoc.replace(stringToReplace,"");
      

      或者,如果要替换多个单词,请使用 replaceAll 的正则表达式。

      【讨论】:

      • 嗯,不,这不是一个好主意。 “a”是停用词。简单地做一个替换会把“apple”变成“pple”,这显然不是你想要的。
      猜你喜欢
      • 2017-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多