【问题标题】:extracting sentences which contain a particular word提取包含特定单词的句子
【发布时间】:2014-06-06 05:16:54
【问题描述】:

我想获取包含特定关键字的文本文件中的句子。我尝试了很多但无法获得包含关键字的正确句子......如果其中任何一个与段落匹配,那么我有更多的一组关键字,那么应该采用它。 例如:如果我的文本文件包含抢劫、抢劫等单词,则应提取该句子。下面是我尝试过的代码。无论如何使用正则表达式来解决这个问题。任何帮助将不胜感激。

  BufferedReader br1 = new BufferedReader(new FileReader("/home/pgrms/Documents/test/one.txt"));
    String str="";

    while(br1 .ready()) 
    {
        str+=br1 .readLine() +"\n";

    }
Pattern re = Pattern.compile("[^.!?\\s][^.!?]*(?:[.!?](?!['\"]?\\s|$)[^.!?]*)*[.!?]?['\"]?(?=\\s|$)", Pattern.MULTILINE | Pattern.COMMENTS);
Matcher match = re.matcher(str);
String sentenceString="";
while (match .find())
{
    sentenceString=match.group(0);
    System.out.println(sentenceString);
}

【问题讨论】:

  • 如何定义“句子”?是否有任何 String 在其末尾有一个换行符定义为“句子”或是否有其他标准?
  • @MadProgrammer str 是一个字符串,其中包含有关抢劫的全部新闻
  • 那么你如何区分句子呢?
  • @MadProgrammer 我已经编辑了我的代码,上面的代码将段落拆分成句子

标签: java regex


【解决方案1】:

以下是您拥有预定义关键字列表时的示例:

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.regex.*;
public class Tester {

    public static void main(String [] args){
        try {
            BufferedReader br1 = new BufferedReader(new FileReader("input"));
            String[] words = {"robbery","robbed", "robbers"};
            String word_re = words[0];   
            String str="";

            for (int i = 1; i < words.length; i++)
                word_re += "|" + words[i];
            word_re = "[^.]*\\b(" + word_re + ")\\b[^.]*[.]";
            while(br1.ready()) { str += br1.readLine(); }
            Pattern re = Pattern.compile(word_re, 
                    Pattern.MULTILINE | Pattern.COMMENTS | 
                    Pattern.CASE_INSENSITIVE);
            Matcher match = re.matcher(str);
            String sentenceString="";
            while (match .find()) {
                sentenceString = match.group(0);
                System.out.println(sentenceString);
            }
        } catch (Exception e) {}
    }

}

这将创建一个形式的正则表达式:

[^.]*\b(robbery|robbed|robbers)\b[^.]*[.]

【讨论】:

    【解决方案2】:

    一般来说,要检查一个句子是否包含robrobberyrobbed,您可以在字符串锚的开头之后,在您的正则表达式模式的其余部分之前添加一个lookehead:

    (?=.*(?:rob|robbery|robbed))
    

    在这种情况下,将rob 分组然后检查潜在的后缀会更有效:

    (?=.*(?:rob(?:ery|ed)?))
    

    在您的 Java 代码中,我们可以(例如)像这样修改您的循环:

    while (match.find())
    {
        sentenceString=match.group(0);
        if (sentenceString.matches("(?=.*(?:rob(?:ery|ed)?))")) {
            System.out.println(sentenceString);
        }
    }
    

    解释正则表达式

    (?=                      # look ahead to see if there is:
      .*                     #   any character except \n (0 or more times
                             #   (matching the most amount possible))
      (?:                    #   group, but do not capture:
        rob                  #     'rob'
        (?:                  #     group, but do not capture (optional
                             #     (matching the most amount possible)):
          ery                #       'ery'
         |                   #      OR
          ed                 #       'ed'
        )?                   #     end of grouping
      )                      #   end of grouping
    )                        # end of look-ahead
    

    【讨论】:

    • 它不起作用 Pattern p1 = Pattern.compile("^(?=.*(?:rob|robbery|robbed))");匹配器 m1 = p1.matcher(str); while (m1.find()) { System.out.println(m1.group(0)); }
    • 目前我的输出显示“sentenceString”,其中有分段分割的句子...我如何插入 reg ex 以使我得到需要的 o/p ..我很新正则表达式...请帮助我
    • @chopu 刚刚在答案中添加了一些 Java 代码,让我知道这是否适合您。 :)
    • 感谢您花这么多时间为我 zx81 ..但它不起作用
    • @chopu 什么时候坏了?您可以将输入拆分为句子,但 System.out.println(sentenceString); 不只过滤 robbery 句子?还是你不能分裂?
    【解决方案3】:

    看看ICU Project 和 icu4j。它会进行边界分析,因此它会为您拆分句子和单词,并且会针对不同的语言进行分析。

    对于其余部分,您可以将单词与 Pattern 进行匹配(如其他人建议的那样),或者将其与您感兴趣的一组单词进行检查。

    【讨论】:

      猜你喜欢
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2013-09-02
      • 1970-01-01
      相关资源
      最近更新 更多