0

Perl の初心者で、助けを求めています。

ファイルのディレクトリと、検索する属性と属性タイプを持つ「キーワード」ファイルがあります。

例えば:

キーワード.txt

Attribute1 boolean
Attribute2 boolean
Attribute3 search_and_extract
Attribute4 chunk

ディレクトリ内の各ファイルについて、次のことを行う必要があります。

  • keys.txt を検索する
  • Attribute種類から探す

以下のようなもの。

IF attribute_type = boolean THEN
 search for attribute;
 set found = Y if attribute found;
ELSIF attribute_type = search_and_extract THEN
 extract string where attribute is Found
ELSIF attribute_type = chunk THEN
 extract the complete chunk of paragraph where attribute is found.

これは私がこれまでに持っているものであり、これを行うためのより効率的な方法があると確信しています。

上記を行うために誰かが私を正しい方向に導いてくれることを願っています。よろしくお願いします、 SiMa

# Reads attributes from config file
# First set boolean attributes. IF keyword is found in text, 
# variable flag is set to Y else N
# End Code: For each  text file in directory loop. 
# Run the below for each document.

use strict;
use warnings;

# open Doc
open(DOC_FILE,'Final_CLP.txt');
while(<DOC_FILE>) {
    chomp;
    # open the file
    open(FILE,'attribute_config.txt');
    while (<FILE>) {
        chomp;
        ($attribute,$attribute_type) = split("\t");

        $is_boolean = ($attribute_type eq "boolean") ? "N" : "Y";

        # For each boolean attribute, check if the keyword exists 
        # in the file and return Y or N
        if ($is_boolean eq "Y") {
            print "Yes\n";
            # search for keyword in doc and assign values
        }   

        print "Attribute: $attribute\n";
        print "Attribute_Type: $attribute_type\n";
        print "is_boolean: $is_boolean\n";
        print "-----------\n";
    }   
    close(FILE);
}
close(DOC_FILE);
exit;
4

1 に答える 1

0

仕様/質問をストーリーで始めることをお勧めします (「I have a ...」)。しかし、そのような話は、真実であろうと作り話であろうと、真実を明らかにすることはできないため、

  • 状況/問題/課題の鮮明な画像
  • すべての作業を行わなければならない理由
  • 珍しい(よく使われる)用語の定義

私は刑務所で働いており、受刑者の電子メールをスキャンして、

  • テキストのどこかに名前 (「アル・カポネ」など) が言及されている。ディレクターはそれらのメールをまとめて読みたいと思っています
  • 注文行 (「武器: AK 4711 数量: 14」など); 兵器担当官は、必要な弾薬とラック スペースの量を計算するためにこれらの情報を求めています。
  • 「妻」、「子供」などの「家族」キーワードを含む段落。牧師は彼女の説教を効率的に準備したい

「キーワード」(~連続テキスト)と「属性」(~構造化テキスト)という用語は、それ自体を理解すると「明確」かもしれませんが、両方が「XI が検索する必要がある」に適用されると、物事はぐちゃぐちゃになります。 . 一般的な (「チャンク」) 用語や技術的な (「文字列」) 用語の代わりに、「実世界」 (行) および特定の (段落) 用語を使用する必要があります。入力のサンプル:

From: Robin Hood
To: Scarface

Hi Scarface,

tell Al Capone to send a car to the prison gate on sunday.

For the riot we need:

weapon: AK 4711 quantity: 14
knife: Bowie quantity: 8

Tell my wife in Folsom to send some money to my son in
Alcatraz.

Regards
Robin

そして期待される出力:

--- Robin.txt ----
keywords:
  Al Capone: Yes
  Billy the Kid: No
  Scarface: Yes
order lines:
  knife:
    knife: Bowie quantity: 8
  machine gun:
  stinger rocket:
  weapon:
    weapon: AK 4711 quantity: 14
social relations paragaphs:
  Tell my wife in Folsom to send some money to my son in
  Alcatraz.

疑似コードは最上位から開始する必要があります。から始めると

for each file in folder
    load search list
    process current file('s content) using search list

それは明らかです

load search list
for each file in folder
    process current file using search list

はるかに良いでしょう。

このストーリー、例、および最上位の計画に基づいて、「検索リストを使用して現在のファイル (のコンテンツ) を処理する」タスクの単純化されたバージョンの概念実証コードを考え出そうとします。

given file/text to search in and list of keywords/attributes

print file name
print "keywords:"
for each boolean item
  print boolean item text
  if found anywhere in whole text
     print "Yes"
  else
     print "No"
print "order line:"
for each line item
  print line item text
  if found anywhere in whole text
     print whole line
print "social relations paragaphs:"
for each paragraph
    for each social relation item
        if found
           print paragraph
           no need to check for other items

最初の実装の試み:

use Modern::Perl;

#use English qw(-no_match_vars);
use English;

exit step_00();

sub step_00 {
  # given file/text to search in
  my $whole_text = <<"EOT";
From: Robin Hood
To: Scarface

Hi Scarface,

tell Al Capone to send a car to the prison gate on sunday.

For the riot we need:

weapon: AK 4711 quantity: 14
knife: Bowie quantity: 8

Tell my wife in Folsom to send some money to my son in
Alcatraz.

Regards
Robin
EOT

  #  print file name
  say "--- Robin.txt ---";
  # print "keywords:"
  say "keywords:";
  # for each boolean item
  for my $bi ("Al Capone", "Billy the Kid", "Scarface") {
  #   print boolean item text
      printf " %s: ", $bi;
  #   if found anywhere in whole text
      if ($whole_text =~ /$bi/) {
  #      print "Yes"
         say "Yes";
  #   else
      } else {
  #      print "No"
         say "No";
      }
  }
  # print "order line:"
  say "order lines:";
  # for each line item
  for my $li ("knife", "machine gun", "stinger rocket", "weapon") {
  #   print line item text
  #   if found anywhere in whole text
      if ($whole_text =~ /^$li.*$/m) {
  #      print whole line
         say " ", $MATCH;
      }
  }
  # print "social relations paragaphs:"
  say "social relations paragaphs:";
  # for each paragraph
  for my $para (split /\n\n/, $whole_text) {
  #     for each social relation item
        for my $sr ("wife", "son", "husband") {
  #         if found
            if ($para =~ /$sr/) {
        ##  if ($para =~ /\b$sr\b/) {
  #            print paragraph
               say $para;
  #            no need to check for other items
               last;
            }
        }
  }
  return 0;
}

出力:

perl 16953439.pl
--- Robin.txt ---
keywords:
 Al Capone: Yes
 Billy the Kid: No
 Scarface: Yes
order lines:
 knife: Bowie quantity: 8
 weapon: AK 4711 quantity: 14
social relations paragaphs:
tell Al Capone to send a car to the prison gate on sunday.
Tell my wife in Folsom to send some money to my son in
Alcatraz.

このような (時期尚早の) コードは、次のことに役立ちます。

  • 仕様を明確にする (not-found キーワードを出力に含めるべきか?
  • 検索リストは本当にフラットですか、それとも構造化/グループ化する必要がありますか?)
  • 物事を行う方法についてのあなたの仮定を確認してください(注文行の検索は、テキスト全体の行の配列で行う必要がありますか?)
  • さらなる研究/rtfm のトピックを特定します (例: 正規表現 (刑務所!))
  • 次のステップを計画する (フォルダー ループ、入力ファイルの読み取り)

(なお、私の悪習はすべて知っている人が指摘してくれるので、最初から避けることができます)

幸運を!

于 2013-06-06T08:29:58.130 に答える