2017-09-18 13 views
0

私はいくつかの古いコードTokensregexコードを調べており、PTBTokenizerによってトークン化されていない文字がいくつかある状況に直面しています。特に、私は通貨記号を見ています。例えば、₱はトークンではないが、他のものは$である。Tokensregexの場合、Annotateを使用するにはトークンタイプである必要がありますか?

さて、トークンタイプの代わりにテキストタイプのルールを書いて、そうでなければキャプチャグループでこのシンボルを捕まえてから、Annotate($0, ner, "MONEY")のようなものを実行して₱240などの文字列をキャプチャしようとします。

私はこれをしようとすると、私が得る:

...もっとによって引き起こさ49:java.lang.ClassCastExceptionが: edu.stanford.nlp.ling.tokensregex.TokenSequencePatternは、javaに をキャストすることはできません。 edu.stanford.nlp.ling.tokensregex.SequenceMatchRules.createExtractionRule(SequenceMatchRules.java:331)で edu.stanford.nlp.ling.tokensregex.SequenceMatchRules $ TextPatternExtractRuleCreator.create(SequenceMatchRules.java:666) でlang.String at edu.stanford.nlp.ling.tokensregex.SequenceMatchRules.createRule(Sequence edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.RuleListでedu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.Rule(TokenSequenceParser.java:141) ( でMatchRules.java:321) 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 more

私は上記のことを行うことができます.MONEY ner annオタゲーション。通貨記号がトークナイザーによって見逃された場合私が欲しいものをやってで

テキストルールの試み(作成NERアノテーションはペソ金銭的価値を含む文字列の通貨と呼ばれる)

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

トークンルールが正常に私が欲しいものをやって(理由円は記録されたトークンです)。これにより、CURRENCYのner注釈を含む円の通貨文字列が作成されます。

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/" 
+0

使用しようとしている完全なルールファイルを投稿してください。 – StanfordNLPHelp

+0

私はそれをすることができないと思いますが、上記の私の質問にはもっと大きな例が含まれます。 – demongolem

答えて

1

あなたはトークナイザがuntokenizableトークンを削除されていないことを確認する必要があります。

コマンド:

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 

例えば、ルール。txt

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

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

トークナイザが正しく設定された状態で、そのシンボルでテキストを実行すると、そのシンボルの別個のトークンが作成されます。

+0

ありがとう、それは私が思ったものです。トークンはありません。アノテーションは生成されません。ルールファイルのためにtokensregexを実行して報告するとき、私は 'allKeep'オプション(と私が使っていないかもしれない他のオプション)を試みます。 – demongolem

+0

ところで、私はチェックして、私は 'noneDelete'を無効にする前に見ました。 – demongolem

+0

はい、うまくいきました、ありがとう。これはパイプラインの一部なので、トレードオフが何であるかを分析する必要があります。私は長い間、なぜそれらの無意味なものを捨てたいのか、何らかの理由があったと思います。 – demongolem

関連する問題