1

我正在尝试从文本文件中提取包含 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'and'milan”的句子(句子边界是句号,后跟空格),即第三句(顺序不重要。任何带有这两个词的句子都需要)
  • 我尝试了上面的正则表达式模式和许多其他的
  • 但它会在“milan”之后提取部分句子或从第一个“he”开始的 2 个句子
  • 请建议使用正则表达式或java中的任何其他方法完成此任务的方法

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

4

2 回答 2

0

请说清楚:

  • 您的语料库是否一致:所有“传记”的格式是否与语法相同?
  • 如果是这样,您需要匹配什么模式,或者更好的是,您需要从匹配项中检索什么?例如,您是否需要“Edison”和“Milan”的键值对?或者...?

如果您的语料库不一致,那么正则表达式可能不是要走的路。如果是这种情况,您可能想要使用字典等 - 可能需要一些艰苦的工作。

于 2013-05-09T18:03:01.763 回答
0

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

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

美好的。使用字符串拆分方法获取句子。使用句号(句点)后跟一个或多个空格作为正则表达式。我将把这个正则表达式的构造留给你。

用“他”和“米兰”这两个词

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

编写另一种方法来遍历您使用另一种拆分方法创建的字符串数组,将句子拆分为单词。同样,我将把这个正则表达式的构造留给你。

当你找到一个包含第一个单词的句子时,循环遍历单词 List,检查 List 中的单词是否在单词边界上分割的句子中。如果你找到了所有的单词,你就找到了一个匹配的句子。如果没有找到所有单词,请继续下一句。

一旦你遍历了句子的拆分字符串数组,你要么有一个句子,要么有一个以上的句子,或者没有包含你的单词列表的句子。

于 2013-05-09T18:25:15.463 回答