如何解决Java中的停用词和词干分析器
| 我正在考虑在我的相似性计划中添加一个停用词,然后使用词干分析器(选择搬运工1或搬运工2取决于最容易实现的方法) 我想知道,既然我从文件中读取了整行的文本并将其保存为长字符串,那么如果我得到两个字符串,那么。String one = \"I decided buy something from the shop.\";
String two = \"Nevertheless I decidedly bought something from a shop.\";
现在我有了那些弦
提取:
我是否可以直接在其上使用stemmer算法,将其另存为String,然后像在程序中实现stemmer之前一样继续进行类似工作,例如运行one.stem();。之类的事情?
停用词:
如何解决? 。
我只用吗? one.replaceall(\“ I \”,\“ \”);还是有一些特定的方法用于此过程?我想继续使用该字符串并获取一个字符串,然后再对其使用相似性算法以获取相似性。 Wiki没说太多。
希望你能帮帮我!谢谢。
编辑:这是一个与学校有关的项目,我正在就不同算法之间的相似性撰写论文,因此我认为我不允许使用lucene或其他为我工作的库。另外,在开始使用Lucene和co之类的库之前,我想尝试并理解它的工作原理。希望它不会太麻烦^^
解决方法
如果出于学术原因未实施此操作,则应考虑使用Lucene库。无论哪种情况,都可以作为参考。它具有用于标记化,停用词过滤,词干和相似性的类。这是一个使用Lucene 3.0删除停用词并阻止输入字符串的简单示例:
public static String removeStopWordsAndStem(String input) throws IOException {
Set<String> stopWords = new HashSet<String>();
stopWords.add(\"a\");
stopWords.add(\"I\");
stopWords.add(\"the\");
TokenStream tokenStream = new StandardTokenizer(
Version.LUCENE_30,new StringReader(input));
tokenStream = new StopFilter(true,tokenStream,stopWords);
tokenStream = new PorterStemFilter(tokenStream);
StringBuilder sb = new StringBuilder();
TermAttribute termAttr = tokenStream.getAttribute(TermAttribute.class);
while (tokenStream.incrementToken()) {
if (sb.length() > 0) {
sb.append(\" \");
}
sb.append(termAttr.term());
}
return sb.toString();
}
如果在您的字符串上使用以下代码:
public static void main(String[] args) throws IOException {
String one = \"I decided buy something from the shop.\";
String two = \"Nevertheless I decidedly bought something from a shop.\";
System.out.println(removeStopWordsAndStem(one));
System.out.println(removeStopWordsAndStem(two));
}
产生以下输出:
decid bui someth from shop
Nevertheless decidedli bought someth from shop
,是的,您可以包装任何词干分析器,以便编写类似
String stemmedString = stemmer.stemAndRemoveStopwords(inputString,stopWordList);
在内部,您的stemAndRemoveStopwords将
将所有停用词放在地图中以快速参考
初始化一个空的StringBuilder来保存输出字符串
遍历输入字符串中的所有单词,并针对每个单词
在stopWordList中搜索;如果找到,继续循环的顶部
否则,使用您喜欢的词干将其词干,并将其添加到输出字符串中
返回输出字符串
,您不必处理整个文本。只需将其拆分,应用停用词过滤器和词干提取算法,然后使用StringBuilder
再次构建字符串:
StrinBuilder builder = new StringBuilder(text.length());
String[] words = text.split(\"\\\\s+\");
for (String word : words) {
if (stopwordFilter.check(word)) { // Apply stopword filter.
word = stemmer.stem(word); // Apply stemming algorithm.
builder.append(word);
}
}
text = builder.toString();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。