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」と「milan」という単語を含む文(文の境界はピリオドの後にスペースが続きます)、つまり 3 番目の文(順序は重要ではありません。両方の単語を含む文が必要です)が必要です
  • 上記の正規表現パターンと他の多くの正規表現を試しました
  • ただし、「milan」の後の文の一部、または最初の「he」から始まる2文を抽出します
  • 正規表現またはJavaの他の方法を使用してこのタスクを実行する方法を提案してください

(私は2つのエンティティ間の関係パターンの抽出に取り組んでいます。この場合、関係パターンはエンティティ「edison」と「milan」の両方で「生まれた」ものです。多数の関連テキストファイルまたはWebドキュメントから上記のような文が必要です[エジソンの伝記や「エジソン ミラノ」の Google からの最初の 500 リンクのように] さらに処理を行うため)

4

2 に答える 2

0

どうか明らかにしてください:

  • あなたのコーパスは一貫していますか:すべての「伝記」は構文ごとに同じようにフォーマットされていますか?
  • もしそうなら、あなたのパターンが一致するために何を必要とするか、またはより良いことに、一致から何を取得する必要がありますか? たとえば、"Edison" と "Milan" のキーと値のペアが必要ですか? または...?

コーパスに一貫性がない場合、正規表現はおそらく適切ではありません。そのような場合は、辞書などを使用することをお勧めします。これは大変な作業になる可能性があります。

于 2013-05-09T18:03:01.763 に答える
0

私の提案は、正規表現がすべての処理を行うことを期待せず、一度に 1 ステップずつテキストを処理することです。

文が欲しいです (文の境界はピリオドの後にスペースが続きます)。

罰金。文字列分割メソッドを使用して、文を取得します。ピリオド (ピリオド) の後に 1 つ以上のスペースが続く正規表現を使用します。この正規表現の構築はあなたに任せます。

「彼」と「ミラノ」という言葉で

罰金。単語を入力して List<String> に追加するメソッドを作成します。

別の split メソッドで作成した String 配列を調べて、文を単語に分割する別のメソッドを作成します。繰り返しますが、この正規表現の構築はあなたに任せます。

最初の単語を含む文が見つかったら、単語リストをループして、リスト内の単語が単語境界で分割された文に含まれているかどうかを確認します。すべての単語を見つけたら、一致する文が見つかりました。すべての単語が見つからない場合は、次の文に進みます。

分割された文の String 配列をループすると、単語のリストを含む文が 1 つまたは複数になるか、文がまったくないことになります。

于 2013-05-09T18:25:15.463 に答える