我刚刚实现了一个使用Java中的Stanford POS标记器的程序。

我使用了一个大小为几KB的输入文件,由几百个单词组成。我什至将堆大小设置为600 MB。

但是它仍然很慢,有时会耗尽堆内存。如何提高其执行速度和内存性能?我希望能够使用几个MB作为输入。

  public static void postag(String args) throws ClassNotFoundException

  {

     try

     {

     File filein=new File("c://input.txt");

     String content = FileUtils.readFileToString(filein);

     MaxentTagger tagger = new MaxentTagger("postagging/wsj-0-18-bidirectional-distsim.tagger");

     String tagged = tagger.tagString(content);

        try
        {
            File file = new File("c://output.txt");
            if (!file.exists())
            {
                file.createNewFile();
            }

            FileWriter fw = new FileWriter(file.getAbsoluteFile());
            BufferedWriter bw = new BufferedWriter(fw);
            bw.write("\n"+tagged);
            bw.close();

            }
              catch (IOException e)
              {
                    e.printStackTrace();
               }

     } catch (IOException e1)
     {
         e1.printStackTrace();
     }

 }

最佳答案

第一个主要建议是使用wsj-0-18-left3words-distsim.tagger(或者对于通用文本,最好使用最新版本的english-left3words-distsim.tagger),而不是wsj-0-18-bidirectional-distsim.tagger。尽管双向标记器的标记性能稍好一些,但速度却慢了约6倍,并且使用的内存大约是后者的两倍。 FWIW:在2012年的MacBook Pro上,当给定足以“预热”的文本时,left3words标记器将以每秒约35000字的速度标记文本。

关于内存使用的另一条建议是,如果您有大量文本,请确保以合理大小的块将其传递给tagString(),而不是全部作为一个巨大的String传递,因为整个String会立即被标记,添加内存需求。

08-25 03:02