如何使用 OpenNLP 为一个 token 分配多个标签?

问题描述 投票:0回答:1

我正在使用 OpenNLP,它可以很好地检测词性等:

try (InputStream modelIn = new FileInputStream("en-pos-maxent.bin"){
  POSModel model = new POSModel(modelIn);
  POSTaggerME tagger = new POSTaggerME(model);
  String tags[] = tagger.tag(tokenList);
}

所以如果 tokens = [测试,食谱,令人难以置信,善良,.] 那么标签 = [ADJ, NOUN, ADP, ADJ, NOUN, PUNCT]

除了定义为词性的标签之外,我还可以添加更多标签吗?如果我想为简短的单词、产品、食物等添加标签怎么办...

我是否需要添加一个带有我的定义的自定义 POS 模型,除了英语 POS 模型之外还运行它,并且只为我运行句子的每个 POS 模型添加额外的标签数组??

我已经尝试过我所描述的方法,定义我自己的模型并运行它,以便我拥有多个数组。我只是想知道是否有其他方法可以比我尝试的更好。

java nlp opennlp
1个回答
0
投票

我决定以这种方式解决这个问题。我所拥有的任何有限的知识在这里似乎都不受限制。

我使用 POSSample 作为将标签和令牌存储在一起的对象,我创建了一个不同的对象,例如 POSSample,它在哈希图中存储相同的标签、令牌,但也可以扩展到我想放入其中的任何其他数据,例如 lems、自定义标签等...

public class TaggedSentence {
    private String sentence;
    private HashMap<TagTypes, List<String>> tagHash = new HashMap<TagTypes, List<String>>();
}

我使用的标签类型作为哈希键只是一个枚举,其中的值可以用于按位运算...因此,当我想要或不希望扫描这些额外标签并将其填充到我的句子中时,我可以轻松标记标记者

public enum TagTypes {
    TOKENS(0B001),
    TAGS(0B010),
    LEMS(0B100);
    // expand this list later as i need
    
    /**
     * Values are set for bitwise operator checks
     */
    public final int value;

    private TagTypes(int value) {
        this.value = value;
    }
}

所以这样做,通常情况下,除非指定我的方法,否则 LEMS 不会被填充:

// only populate my object with tokens
TaggedSentence pos = nlpService.tokenizeSentence(sentence);

// populate my object with tokens, tags (since lems requires tags), and lems 
TaggedSentence pos = nlpService.tokenizeSentence(sentence, TagTypes.LEMS.value);

// populate my object with lems and any other random tagtype category I add to my enum to scan for later
TaggedSentence pos = nlpService.tokenizeSentence(sentence, TagTypes.LEMS.value | TagTypes.SOMEOTHERTYPE.value);
© www.soinside.com 2019 - 2024. All rights reserved.