从java中的文本文件中提取包含2个单词的句子

时间:2013-05-09 17:49:41

标签: java regex

我正在尝试从文本文件中提取包含2个单词的句子。我使用了正则表达式,如下面的代码所示。

File doc = new File("D:\\MyFile.txt");

BufferedReader br = null;

System.out.println("enter the regex pattern to be matched");
Scanner keyboard = new Scanner(System.in);
String regxpat = keyboard.nextLine();


  String line;
  br = new BufferedReader(new FileReader(doc));     
  Pattern p = Pattern.compile(regxpat, CASE_INSENSITIVE);



  while ((line = br.readLine()) != null) 
  {

    try
    {
        Matcher m = p.matcher(line);
        m.find();

        System.out.print(m.group().toString());

    }        
    catch (IllegalStateException e) 
    {
    }
    continue;

  }
//i tried regex= "(he)*([.&&[^\.]]*?)Milan(.*?)\."

如果文字是:

"...Thomas Edison is a scientist. He invented bulb. He was born in Milan, Ohio, and grew up in Port Huron, Michigan. He was the seventh and last child of Samuel Ogden Edison, Jr...."
  • 我希望句子(句子边界是完整的句号,后跟空格),用'he'和'milan'来表示,即第3个上瘾(顺序不重要。需要两个单词的句子)
  • 我尝试了上面的正则表达式pattrn和许多其他人
  • 但它从'milan'之后提取部分句子或从第一个'他'
  • 开始提取2个句子
  • 请建议使用regex或java中的任何其他方法完成此任务的方法

(我正致力于提取2个实体之间的关系模式:在这种情况下,关系模式是“生于”实体“爱迪生”和“米兰”。 我需要从众多相关文本文件或网络文档中获得上述句子[如爱迪生传记或谷歌“爱迪生米兰”上的前500个链接]进行进一步处理)

2 个答案:

答案 0 :(得分:0)

请澄清:

  • 您的语料库是否一致:所有“传记”的格式与语法相同?
  • 如果是这样,您需要什么模式来匹配,或者更好,您需要从匹配中检索什么?例如,你需要一个与“爱迪生”和“米兰”的键值对吗?还是...?

如果你的语料库一致,那么正则表达式可能就不合适了。 如果是这种情况,你可能想要使用字典等 - 可能会有一些艰苦的工作。

答案 1 :(得分:0)

我的建议是不要指望正则表达式执行所有处理,并一次一步地处理文本。

  

我想要句子(句子边界是句号,然后是空格)。

精细。使用String split方法获取句子。使用句号(句点),后跟一个或多个空格作为正则表达式。我会把这个正则表达式的结构留给你。

  

用'他'和'米兰'这个词来表达

精细。编写一个方法来输入单词并将它们添加到List< String>。

编写另一种方法来浏览您使用另一种拆分方法创建的String数组,将该句子拆分为单词。再说一次,我将把这个正则表达式的结构留给你。

当你找到带有第一个单词的句子时,循环单词List,检查列表中的单词是否在单词边界上的句子中。如果找到所有单词,则会找到匹配的句子。如果找不到所有单词,请继续下一句。

一旦你通过分裂的String语句数组循环,你要么有一个句子,一个以上的句子,要么没有包含你的单词列表的句子。