使用Stanford CoreNLP提取电子邮件地址和电话号码

Ahm*_*OUR 0 nlp stanford-nlp

我一直在寻找一种解决方案,使用Stanford CoreNLP(RegexNERAnnotator)从文本中提取电子邮件地址,电话号码...... 任何人都可以提供任何例子吗?

更新:04/11/2015: 实际上我应该问一下Stanford RegexNERAnnotator是否可以支持Java正则表达式.

用法示例:

       final String EMAIL_PATTERN = 
            "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

       List<CoreLabel> tokens = ...;
       TokenSequencePattern pattern = TokenSequencePattern.compile(EMAIL_PATTERN);
       TokenSequenceMatcher matcher = pattern.getMatcher(tokens);

       while (matcher.find()) {
         String matchedString = matcher.group();
         List<CoreMap> matchedTokens = matcher.groupNodes();
         ...
       }
Run Code Online (Sandbox Code Playgroud)

它似乎不支持Java正则表达式:

Exception in thread "main" edu.stanford.nlp.ling.tokensregex.parser.TokenMgrError: Lexical error at line 1, column 1.  Encountered: "^" (94), after : ""
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParserTokenManager.getNextToken(TokenSequenceParserTokenManager.java:1029)
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.jj_ntk(TokenSequenceParser.java:3228)
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.SeqRegexBasic(TokenSequenceParser.java:784)
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.SeqRegexDisjConj(TokenSequenceParser.java:973)
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.SeqRegex(TokenSequenceParser.java:743)
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.SeqRegexWithAction(TokenSequenceParser.java:1596)
    at edu.stanford.nlp.ling.tokensregex.parser.TokenSequenceParser.parseSequenceWithAction(TokenSequenceParser.java:37)
    at edu.stanford.nlp.ling.tokensregex.TokenSequencePattern.compile(TokenSequencePattern.java:186)
    at edu.stanford.nlp.ling.tokensregex.TokenSequencePattern.compile(TokenSequencePattern.java:169)
Run Code Online (Sandbox Code Playgroud)

Gab*_*eli 5

StackOverflow不是教程甚至示例的地方.但是,即使不需要RegexNER,它似乎也可以正常使用正则表达式.从一些谷歌搜索,请参阅使用正则表达式验证电子邮件的电子邮件地址.电话号码应该像以下一样简单,但直截了当的正则表达式:

(\+[0-9]{1,2}(\s*|-)?)?(\(?[0-9]{3}\)?)?(\s*|-)[0-9]{3}(\s*|-)[0-9]{4}
Run Code Online (Sandbox Code Playgroud)

我的猜测是,Stanford Tokenizer的标记化会使这更难,也不容易.

  • 确实 - 但这也意味着你可能不想在这些情况下使用TokensRegex.如果您绝对需要捕获每个有效的电子邮件地址,那么您将无法实施完整的规范.否则,regexp可能会捕获99.9%的案例. (2认同)