【问题标题】:extracting sentence containing 2 words from a text file in java从java中的文本文件中提取包含2个单词的句子
【发布时间】:2013-05-09 17:49:41
【问题描述】:

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

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

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

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

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

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

    很好。编写一个方法来输入单词并将它们添加到 List

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

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

    一旦你遍历了句子的分割字符串数组,你要么有一个句子,多于一个句子,要么没有句子包含你的单词列表。

    【讨论】:

    • 我尝试使用字符串拆分方法,但我给出的正则表达式模式或其他问题存在一些问题。
    • File doc = new File("D:\\aMyFile.txt");BufferedReader br = null;String line;br = new BufferedReader(new FileReader(doc));while ((line = br.readLine()) != null) { for (String retval: line.split("\.\s")) System.out.println(retval); }
    • 对不起代码格式。使用了反引号``但不知道如何使用回车
    • 是的,我将文本分成句子,然后我使用了正则表达式。现在可以正常使用了。
    【解决方案2】:

    请澄清:

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

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

    【讨论】:

    • + 是的,语料库不一致。我的任务 2 提取关系模式 b/w 实体。 + 例如:对于 Edison n milan,父亲可能是“出生地/出生地/出生地等”。 +我应该从no中提取带有这两个词的句子。的相关文档 n 使用一种频率过滤器来提取这些模式,因为这些模式经常出现。 + 那么我也应该使用字典......是的,还有一些努力工作:)。 + 到目前为止,我需要带有 2 个给定单词的句子。
    • 我明白了。因此,通过“我需要带有 2 个给定单词的句子”,您的意思是您要检查语料库中包含名称的句子 1,以及包含“出生于”表达的句子 2,如果是,则提取名称和位置两个句子中的候选词。我的解释正确吗?
    • 我想要包含“爱迪生”和“米兰”这两个词的句子。如果没有找到匹配项,我将搜索带有“he”和“milan”的句子。从没有这样的句子。的相关文本文档显然会包含诸如“出生地/出生地/出生地等”的关系模式,然后可以在进一步处理后提取
    • 然后我会使用字典:常见的城市/城镇名称,常见或著名的姓氏,一种带有“出生于”表达,另一种带有代词。表达式的正确组合将允许您挖掘所需的数据。我认为在这里尝试起草任何具体的实现都超出了范围。您可以开始检查复杂的解析/挖掘工具,例如 antlr.org ...抱歉,我不能更具体!
    猜你喜欢
    • 1970-01-01
    • 2013-09-02
    • 2013-04-08
    • 2021-09-18
    • 1970-01-01
    • 2012-07-19
    • 2020-10-10
    相关资源
    最近更新 更多