对于Tokensregex,规则是否需要是令牌类型才能使用Annotate?

时间:2017-09-18 22:18:55

标签: stanford-nlp

我正在查看一些旧的代码Tokensregex代码,我遇到的情况是某些字符没有被PTBTokenizer标记化。特别是,我正在看货币符号。因此,例如,₱不会是令牌,而其他一些则是$ will。

好吧,我想尝试编写一个文本类型规则而不是令牌类型,试图在捕获组中捕获此符号,然后执行Annotate($0, ner, "MONEY")之类的操作来捕获字符串,例如₱240。

当我尝试这个时,我得到:

  

... 49更多引起:java.lang.ClassCastException:   edu.stanford.nlp.ling.tokensregex.TokenSequencePattern无法投射   到java.lang.String at   edu.stanford.nlp.ling.tokensregex.SequenceMatchRules $ TextPatternExtractRuleCreator.create(SequenceMatchRules.java:666)     在   edu.stanford.nlp.ling.tokensregex.SequenceMatchRules.createExtractionRule(SequenceMatchRules.java:331)     在   edu.stanford.nlp.ling.tokensregex.SequenceMatchRules.createRule(SequenceMatchRules.java:321)     在   edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.Rule(TokenSequenceParser.java:141)     在   edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.RuleList(TokenSequenceParser.java:125)     在   edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.updateExpressionExtractor(TokenSequenceParser.java:32)     在   edu.stanford.nlp.ling.tokensregex.CoreMapExpressionExtractor.createExtractorFromFiles(CoreMapExpressionExtractor.java:292)     ... 52更多

我可以这样做,创建一个MONEY ner注释。如果分币器错过了货币符号吗?

示例

文本规则尝试执行我想要的操作(为包含比索货币值的字符串创建名为CURRENCY的ner注释)

ENV.defaults["ruleType"] = "text"
{ text: /(₱\d+)/ => Annotate($0, ner, "CURRENCY")}

令牌规则成功地做了我想要的事情(因为日元是一个识别的令牌)。这会创建一个日元货币字符串,其中包含CURRENCY的注释。

ENV.defaults["ruleType"] = "tokens"
ENV.defaults["matchWithResults"] = TRUE

# Set default string pattern flags (to case-insensitive)
ENV.defaultStringPatternFlags = 2

ENV.defaults["stage"] = 0

# Ex: ¥3000
{   
pattern:  ([{ word: "¥" }] $NUMBER_COMMA_SEP $LARGE_NUMBERS?),
action: (Annotate($0, ner, "CURRENCY"))
}

ner定义为:

ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }

然后:

$NUMBER_COMMA_SEP = "$NUMBER_NON_CD | ([{ tag: /CD/ } & $VALID_NUMERIC_CHARS] [{ tag: /CD/; word: /,\d+(\.\d+)?/ }]*)"
$LARGE_NUMBERS = "/thousand|million|mil|mn|billion|bil|bn|trillion/"

1 个答案:

答案 0 :(得分:1)

您需要确保令牌化程序没有删除不可识别的令牌。

命令:

java -Xmx8g edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,tokensregex -tokensregex.rules example-rules.txt -props StanfordCoreNLP-spanish.properties -tokenize.options "untokenizable=allKeep" -file example.txt -outputFormat text

例如-rules.txt

ner = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }

{ pattern: ( /₱/ /[0-9]+/ ) , action: (Annotate($0, ner, "CURRENCY") ) }

如果您运行带有该符号且带有正确配置的标记符的文本,它将为该符号创建一个不同的标记。