我正在使用 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 模型添加额外的标签数组??
我已经尝试过我所描述的方法,定义我自己的模型并运行它,以便我拥有多个数组。我只是想知道是否有其他方法可以比我尝试的更好。
我决定以这种方式解决这个问题。我所拥有的任何有限的知识在这里似乎都不受限制。
我使用 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);