仕様/質問をストーリーで始めることをお勧めします (「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 のトピックを特定します (例: 正規表現 (刑務所!))
- 次のステップを計画する (フォルダー ループ、入力ファイルの読み取り)
(なお、私の悪習はすべて知っている人が指摘してくれるので、最初から避けることができます)
幸運を!