【问题标题】:Reading POS tag models in Android在 Android 中读取 POS 标签模型
【发布时间】:2012-11-03 18:34:02
【问题描述】:

我尝试在普通 Java 应用程序上使用 openNLP POS Models 进行 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)

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

谢谢。

【问题讨论】:

  • 使用 AssetManager 可能会有帮助吗?尝试将文件移动到项目的资产文件夹中。然后尝试以下操作: AssetManager am = getAssets(); InputStream is = am.open("en-pos-maxent.bin");
  • 我也尝试过使用 AssetManager.. 它也没有读取模型。还有什么办法吗?我可以放入外部库并从中调用吗?有可能吗?

标签: android machine-learning nlp opennlp


【解决方案1】:

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

【讨论】:

  • 您好,感谢您提供非常有用的见解。它确实解决了我的问题。唯一的问题是在 Android 上运行这个模型有点重。我正在考虑一种在其他地方运行它来处理它的方法。
  • 我可以肯定地看到它在 android 上相当繁重,尤其是加载时间,如果它只是为了快速识别。老实说,我自己并没有太多的 android 经验,但我认为必须有一个用于本机识别的包,您可以将其重用于简单的解析。如果您需要完整的 OpenNlp POS,我认为最好的选择是将它放在服务器上(如果可以的话)。不过,如果我在旅​​途中遇到任何事情,我会告诉你的,祝你好运!
  • 是的,我认为选择服务器将是最好的选择。但是我需要一些东西来启动开发,因为我不熟悉在服务器上运行活动。如果你有分享谢谢:)
【解决方案2】:

试试这个,它对我有用

    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) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多