标记阿拉伯语文本文件java



我正在尝试将一些文本文件标记为单词,我写了这个代码,它在英语中非常有效,当我在阿拉伯语中尝试时,它不起作用。我添加了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

相关内容

  • 没有找到相关文章

最新更新