使用 Stanford CoreNLP 提取电子邮件地址、phone 个数字
Extracting email addresses, phone numbers using Stanford CoreNLP
我一直在寻找使用 Stanford CoreNLP (RegexNERAnnotator) 从文本中提取电子邮件地址、phone 数字...的解决方案。任何人都可以提供任何例子吗?
更新:2015 年 4 月 11 日:
实际上,我应该问问 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();
...
}
好像不支持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)
Whosebug 不是提供教程甚至示例的地方。但是,似乎常规正则表达式应该可以工作,即使不需要 RegexNER。通过一些谷歌搜索,查看电子邮件的 Using a regular expression to validate an email address。 Phone 数字应该像以下长而简单的正则表达式一样简单:
(\+[0-9]{1,2}(\s*|-)?)?(\(?[0-9]{3}\)?)?(\s*|-)[0-9]{3}(\s*|-)[0-9]{4}
我的猜测是 Stanford Tokenizer 的标记化会使这变得更难而不是更容易。
我一直在寻找使用 Stanford CoreNLP (RegexNERAnnotator) 从文本中提取电子邮件地址、phone 数字...的解决方案。任何人都可以提供任何例子吗?
更新:2015 年 4 月 11 日: 实际上,我应该问问 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();
...
}
好像不支持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)
Whosebug 不是提供教程甚至示例的地方。但是,似乎常规正则表达式应该可以工作,即使不需要 RegexNER。通过一些谷歌搜索,查看电子邮件的 Using a regular expression to validate an email address。 Phone 数字应该像以下长而简单的正则表达式一样简单:
(\+[0-9]{1,2}(\s*|-)?)?(\(?[0-9]{3}\)?)?(\s*|-)[0-9]{3}(\s*|-)[0-9]{4}
我的猜测是 Stanford Tokenizer 的标记化会使这变得更难而不是更容易。