我正在尝试将一些文本文件标记为单词,我写了这个代码,它在英语中非常有效,当我在阿拉伯语中尝试时,它不起作用。我添加了UTF-8来读取阿拉伯语文件。我错过什么了吗
public void parseFiles(String filePath) throws FileNotFoundException, IOException {
File[] allfiles = new File(filePath).listFiles();
BufferedReader in = null;
for (File f : allfiles) {
if (f.getName().endsWith(".txt")) {
fileNameList.add(f.getName());
Reader fstream = new InputStreamReader(new FileInputStream(f),"UTF-8");
// BufferedReader br = new BufferedReader(fstream);
in = new BufferedReader(fstream);
StringBuilder sb = new StringBuilder();
String s=null;
String word = null;
while ((s = in.readLine()) != null) {
Scanner input = new Scanner(s);
while(input.hasNext()) {
word = input.next();
if(stopword.isStopword(word)==true)
{
word= word.replace(word, "");
}
//String stemmed=stem.stem (word);
sb.append(word+"t");
}
//System.out.print(sb); ///here the arabic text is outputed without stopwords
}
String[] tokenizedTerms = sb.toString().replaceAll("[\W&&[^\s]]", "").split("\W+"); //to get individual terms
for (String term : tokenizedTerms) {
if (!allTerms.contains(term)) { //avoid duplicate entry
allTerms.add(term);
System.out.print(term+"t"); //here the problem.
}
}
termsDocsArray.add(tokenizedTerms);
}
}
}
请有什么想法可以帮助我继续。感谢
问题在于正则表达式,它适用于英语,但不适用于阿拉伯语,因为根据定义
[\W&&[^\s]
指
// returns true if the string contains a arbitrary number of non-characters except whitespace.
W A non-word character other than [a-zA-Z_0-9]. (Arabic chars all satisfy this condition.)
s A whitespace character, short for [ tnx0brf]
因此,根据这个逻辑,阿拉伯语的所有字符都将由这个正则表达式选择。所以,当你给
sb.toString().replaceAll("[\W&&[^\s]]", "")
这意味着,将所有不是空格的非单词字符替换为"。在阿拉伯语的情况下,这都是字符。因此,您将遇到一个问题,即所有阿拉伯字符都被"替换。因此,不会有产出。你必须调整这个正则表达式来处理阿拉伯语文本,或者像一样用空格分割字符串
sb.toString().split("\s+")
它将为您提供用空格分隔的阿拉伯语单词数组。
除了担心bgth的回应中的字符编码外,接受阿拉伯语还有一个额外的复杂性,即单词不一定是空格分隔的:
http://www1.cs.columbia.edu/~rambow/papers/habash-rambow-2005a.pdf
如果你不熟悉阿拉伯语,你需要阅读一些关于tolkenization的方法:
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.120.9748