有没有办法在Java中匹配句子的开始和结束?最简单的情况是以简单(。)点结尾。在其他一些情况下,它可以以colum(:)或以colum(。:)结尾的快捷方式结束。
例如一些随机新闻文字:
在该市发生地震期间,新西兰的悬崖已经倒塌 基督城在南岛。没有严重的伤害或死亡 在当地时间13:13发生的情人节地震中报道了这一情况 时间。根据 med。报告,每个人都可以。
我的目标是获取单词的快捷方式+它的上下文,但如果可能的话,只有快捷方式所在的句子。
所以,如果我能得到这样的东西,那么我的成功输出将是:
选定的字 - >折叠
上下文 - >在南岛基督城市发生地震时,新西兰的悬崖倒塌了。
选定的字 - > MED。
上下文 - >根据 med。报告,每个人都可以。
由于
答案 0 :(得分:3)
您正在寻找的是一种自然语言处理工具包。对于java,您可以使用:CoreNLP 他们的教程页面上已经有一些示例案例。 你当然可以制作一个正则表达式来查找字符集之间的所有字符(。:?etc ...),它看起来像这样:
\.*?(?=[\.\:])\
然后你必须遍历匹配的结果并找到包含你的单词的相关句子。但我建议您使用NLP来实现这一目标。
答案 1 :(得分:3)
代码:
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main( String[] args ) {
final Map<String, String> dict = new HashMap<>();
dict.put( "med", "medical" );
final String text =
"Cliffs have collapsed in New Zealand during an earthquake in the "
+ "city of Christchurch on the South Island. No serious damage or "
+ "fatalities were reported in the Valentine's Day quake that struck "
+ "at 13:13 local time. Based on the med. report everybody were ok.";
final Pattern p = Pattern.compile( "[^\\.]+\\W+(\\w+)\\." );
final Matcher m = p.matcher( text );
int pos = 0;
while(( pos < text.length()) && m.find( pos )) {
pos = m.end() + 1;
final String word = m.group( 1 );
if( dict.containsKey( word )) {
final String repl = dict.get( word );
final String beginOfSentence = text.substring( m.start(), m.end());
final String endOfSentence;
if( m.find( pos )) {
endOfSentence = text.substring( m.start() - 1, m.end());
}
else {
endOfSentence = text.substring( m.start() - 1);
}
System.err.printf( "Replace '%s.' in '%s%s' with '%s'\n",
word, beginOfSentence, endOfSentence, repl );
final String sentence =
( beginOfSentence + endOfSentence ).replaceAll( word+'.', repl );
System.err.println( sentence );
}
}
}
}
执行:
Replace 'med.' in 'Based on the med. report everybody were ok.' with 'medical'
Based on the medical report everybody were ok.
答案 2 :(得分:2)
你很容易发现这句话。它以大写字母开头,以.:!?
个字符之一结尾,后跟空格和另一个大写字母,或者到达整个字符串的末尾。
比较差异time. Based
和med. report
。
因此捕获整个句子的正则表达式应如下所示:
([A-Z][a-z].*?[.:!?](?=$| [A-Z]))
看一看! Regex101