4

我尝试在普通 Java 应用程序上使用openNLP POS 模型进行 POS 标记。现在我想在Android平台上实现它。我不确定 Android 的要求或限制是什么,因为我无法读取模型(二进制文件)并正确执行 POS 标记。

我尝试从外部存储中获取 .bin 文件并将其放入外部库中,但仍然无法正常工作。这些是我的代码:

InputStream modelIn = null;
POSModel model = null;

String path = Environment.getExternalStorageDirectory().getPath() + "/TextSumIt/en-pos-maxent.bin";

modelIn = new BufferedInputStream( new FileInputStream(path));
model = new POSModel(modelIn);

我得到的错误:

11-15 06:39:35.072: W/System.err(565): opennlp.tools.util.InvalidFormatException: The profile data stream has an invalid format!
11-15 06:39:35.177: W/System.err(565):  at opennlp.tools.dictionary.serializer.DictionarySerializer.create(DictionarySerializer.java:224)
11-15 06:39:35.177: W/System.err(565):  at opennlp.tools.postag.POSDictionary.create(POSDictionary.java:282)
11-15 06:39:35.182: W/System.err(565):  at opennlp.tools.postag.POSModel$POSDictionarySerializer.create(POSModel.java:48)
11-15 06:39:35.182: W/System.err(565):  at opennlp.tools.postag.POSModel$POSDictionarySerializer.create(POSModel.java:44)
11-15 06:39:35.182: W/System.err(565):  at opennlp.tools.util.model.BaseModel.<init>(BaseModel.java:135)
11-15 06:39:35.197: W/System.err(565):  at opennlp.tools.postag.POSModel.<init>(POSModel.java:93)
11-15 06:39:35.197: W/System.err(565):  at com.main.textsumit.SummarizationActivity.postagWords(SummarizationActivity.java:676)
11-15 06:39:35.205: W/System.err(565):  at com.main.textsumit.SummarizationActivity.generateSummary(SummarizationActivity.java:252)
11-15 06:39:35.205: W/System.err(565):  at com.main.textsumit.SummarizationActivity.onCreate(SummarizationActivity.java:127)

是什么导致它无法正确读取模型?我应该如何解决这个问题?请帮忙。

谢谢你。

4

2 回答 2

1

对于它的价值,如果这仍然是一个问题:我在尝试在不同的上下文(非 Android)中使用 POS 模型时遇到了类似的问题,在我的情况下,它似乎是从 bin 文件中提取失败,而不是模型本身的任何东西。它似乎是存档中 tags.tagdict 文件的本地文件(如此处建议的http://sharpnlp.codeplex.com/discussions/263620),所以如果您目前不需要它(而且我不需要简单的场景)然后尝试将其从存档中删除。(但请保持存档完好无损,因为它预计将以压缩形式到达。)

于 2012-11-26T12:06:47.163 回答
1

试试这个,它对我有用

    System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver");
    try {
        AssetFileDescriptor fileDescriptor = 
        context.getAssets().openFd("en_pos_maxent.bin");
        FileInputStream inputStream = fileDescriptor.createInputStream();
        POSModel posModel = new POSModel(inputStream);
        posTaggerME = new POSTaggerME(posModel);
    } catch (Exception e) {}
于 2017-12-10T04:01:33.553 回答