我正在使用RapidMiner 5.我想制作一个文本预处理模块,用于分类系统。我使用这些步骤在RapidMiner中创建了一个过程。
我想编写一个脚本来对这些单词进行拼写校正。所以,我使用了'Execute Script'操作符并编写了一个groovy脚本来执行此操作(从此处raelcunha)。这是我在快速矿工的执行脚本操作符中编写的代码(由RapidMiner社区帮助)。
Document doc=input[0]
List<Token> newTokens = new LinkedList<Token>();
nWords=train("set2.txt")
for (Token token : doc.getTokenSequence()) {
//String output=correct((String)token.getToken(),nWords)
println token.getToken();
Token nToken = new Token(correct("garbge",nWords), token);
newTokens.add(nToken);
}
doc.setTokenSequence(newTokens);
return doc;
这是拼写纠正的代码。 (感谢Norvig。)
import com.rapidminer.operator.text.Document;
import com.rapidminer.operator.text.Token;
import java.util.List;
import java.util.LinkedList;
def train(f){
def n = [:]
new File(f).eachLine{it.toLowerCase().eachMatch(/\w+/){n[it]=n[it]?n[it]+1:1}}
n
}
def edits(word) {
def result = [], n = word.length()-1
for(i in 0..n) result.add(word[0..<i] + word.substring(i+1))
for(i in 0..n-1) result.add(word[0..<i] + word[i+1] + word[i, i+1] + word.substring(i+2))
for(i in 0..n) for(c in 'a'..'z') result.add(word[0..<i] + c + word.substring(i+1))
for(i in 0..n) for(c in 'a'..'z') result.add(word[0..<i] + c + word.substring(i))
result
}
def correct(word, nWords) {
if(nWords[word]) return word
def list = edits(word), candidates = [:]
for(s in list) if(nWords[s]) candidates[nWords[s]] = s
if(candidates.size() > 0) return candidates[candidates.keySet().max()]
for(s in list) for(w in edits(s)) if(nWords[w]) candidates[nWords[w]] = w
return candidates.size() > 0 ? candidates[candidates.keySet().max()] : word
}
我在调用edits
方法时遇到String index out of bounds异常。
并且,我不知道如何调试这个,因为rapidminer只是告诉我Execute Script运算符中存在一个问题,而不是说哪个脚本行导致了这个问题。
所以,我打算通过在Java中创建一个运算符来做同样的事情 - How to extend RapidMiner
我做的事情:
将RapidMiner Lib文件夹中的所有jar文件(C:\ Program Files(x86)\ Rapid-I \ RapidMiner5 \ lib)包含到我的java项目的构建路径中。
使用上面给出的链接使用相同的指南开始编码。
我的运算符的输入是一个Document(com.rapidminer.operator.text.Document) 如在脚本中。
但是,我无法在此代码中使用此Document对象。你能告诉我为什么吗?文本处理罐位于何处?
对于使用插件jar,我们是否应该向BuildPath添加一些其他位置?