私のブックリスト(txtファイル)には次のような重複があります-
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Joy on Demand: The Art of Discovering the Happiness Within
Crucial Conversations Tools for Talking When Stakes Are High
Joy on Demand
Search Inside Yourself: The Unexpected Path to Achieving Success, Happiness
Search Inside Yourself
......
......
......
重複する本を見つけて、確認してから手動で削除する必要があります。検索したところ、線にパターンが必要であることがわかりました。
例.
ファイル内の部分的な重複行を見つけて、各行が重複した回数を数えますか?
しかし、私の場合、線のパターンを見つけるのは困難です。しかし、単語のシーケンスにパターンが見つかりました。
3つの連続する単語(大文字と小文字を区別しない)がある場合にのみ、行を重複としてマークしたいと思います。
あなたが見るならあなたはそれを見つけるでしょう-
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Ideal Team Player
は私が探している連続した単語です。
次のような出力にしたいと思います-
3 Ideal Team Player
2 Joy on Demand
2 Search Inside Yourself
......
......
......
どうやってやるの?
次のawk
プログラムは、(句読文字を削除した後)3つの連続する単語の各セットが発生する回数のカウントを格納し、カウントが1より大きい場合は、カウントと単語のセットを最後に出力します。
{
gsub("[[:punct:]]", "")
for (i = 3; i <= NF; ++i)
w[$(i-2),$(i-1),$i]++
}
END {
for (key in w) {
count = w[key]
if (count > 1) {
gsub(SUBSEP," ",key)
print count, key
}
}
}
あなたの質問のテキストを考えると、これは
2 Search Inside Yourself
2 Cultivate The Three
2 The Three Essential
2 Joy on Demand
2 Recognize and Cultivate
2 Three Essential Virtues
2 and Cultivate The
2 The Ideal Team
3 Ideal Team Player
ご覧のとおり、これはあまり役に立たないかもしれません。
代わりに、同じカウント情報を収集してから、ファイルに対して2回目のパスを実行し、カウントが1より大きいWordトリプレットを含む各行を印刷できます。
NR == FNR {
gsub("[[:punct:]]", "")
for (i = 3; i <= NF; ++i)
w[$(i-2),$(i-1),$i]++
next
}
{
orig = $0
gsub("[[:punct:]]", "")
for (i = 3; i <= NF; ++i)
if (w[$(i-2),$(i-1),$i] > 1) {
print orig
next
}
}
ファイルのテスト:
$ cat file
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Joy on Demand: The Art of Discovering the Happiness Within
Crucial Conversations Tools for Talking When Stakes Are High
Joy on Demand
Search Inside Yourself: The Unexpected Path to Achieving Success, Happiness
Search Inside Yourself
$ awk -f script.awk file file
The Ideal Team Player
The Ideal Team Player: How to Recognize and Cultivate The Three Essential Virtues
Ideal Team Player: Recognize and Cultivate The Three Essential Virtues
Joy on Demand: The Art of Discovering the Happiness Within
Joy on Demand
Search Inside Yourself: The Unexpected Path to Achieving Success, Happiness
Search Inside Yourself
警告:このawk
プログラムは、ファイルのテキストを約3回保存するのに十分なメモリを必要とし、エントリが実際に複製されていない場合でも、一般的なフレーズで重複を見つける可能性があります(たとえば、「調理方法」はいくつかの本のタイトルの一部)。
IMO、このタスクは、3つの連続する単語を探すよりも、単語のセットの共通部分を使用してより適切に解決されます。
したがって、次のPerlスクリプトはnot3つの連続する単語を検索しません。代わりに、最初に(stdinおよび/または1つ以上のファイルから)入力全体を読み取り、( Set :: Tiny モジュールを使用して)各入力行の単語のセットを作成します。
次に、入力を2回処理し、(各行について)最初のパスで読み取られた、正確に重複している行、または交差点がある行を出力します。 )のセットには3つ以上の要素があります。
%sets
というハッシュ配列を使用して各タイトルの単語セットを格納し、%titles
という別のハッシュを使用して各タイトルを表示した回数をカウントします。これは出力フェーズで使用され、入力で見られたよりも頻繁にタイトルを印刷することはありません。
つまり、重複する行と類似の行(つまり、同じ単語が少なくとも3つ含まれている行)を並べて印刷します。3つの単語が連続している必要はありません。
スクリプトは、セットを作成するときにいくつかの非常に一般的な小さな単語を無視しますが、これは、コメントアウトするか、OPTIONAL...
コメントのある行を削除することで無効にできます。または、必要に応じて一般的な単語リストを編集することもできます。
言及する価値のあることの1つは、スクリプト内の小さな単語リストに単語by
が含まれていることです。必要に応じてリストから削除できますが、スクリプトがby
plusanyで一致しないようにするためです。 )他の2つの単語-例: Aardvark Taxidermy for Personal Wealth by Peter Smith
はThe Wealth of Nations by Adam Smith
と一致します(by
、Wealth
、およびSmith
で一致します)。最初の本は(私は願っていますが)完全に存在していませんが、存在したとしても、経済学のテキストとはまったく関係がありません。
注:このスクリプトは、入力全体と、各入力行に関連付けられたWordセットをメモリに保存します。これは、入力が極端に大きくない限り、GiB of free RAM)が少ない最新のシステムでは問題になる可能性はほとんどありません。
注2:Set::Tiny
はDebian用にlibset-tiny-Perl
としてパッケージ化されています。他のディストリビューション用にパッケージ化された状態で入手できる場合もあります。それ以外の場合は、上記のCPANリンクから入手できます。
#!/usr/bin/Perl -w
use strict;
use Set::Tiny;
# a partial list of common articles, prepositions and small words joined into
# a regex.
my $sw = join("|", qw(
a about after against all among an and around as at be before between both
but by can do down during first for from go have he her him how
I if in into is it its last like me my new of off old
on or out over she so such that the their there they this through to
too under up we what when where with without you your)
);
my %sets=(); # Word sets for each title.
my %titles=(); # count of how many times we see the same title.
while(<>) {
chomp;
# take a copy of the original input line, so we can use it as
# a key for the hashes later.
my $orig = $_;
# "simplify" the input line
s/[[:punct:]]//g; #/ strip punctuation characters
s/^\s*|\s*$//g; #/ strip leading and trailing spaces
$_=lc; #/ lowercase everything, case is not important.
s/\b($sw)\b//iog; #/ optional. strip small words
next if (/^$/);
$sets{$orig} = Set::Tiny->new(split);
$titles{$orig}++;
};
my @keys = (sort keys %sets);
foreach my $title (@keys) {
next unless ($titles{$title} > 0);
# if we have any exact dupes, print them. and make sure they won't
# be printed again.
if ($titles{$title} > 1) {
print "$title\n" x $titles{$title};
$titles{$title} = 0;
};
foreach my $key (@keys) {
next unless ($titles{$key} > 0);
next if ($key eq $title);
my $intersect = $sets{$key}->intersection($sets{$title});
my $k=scalar keys %{ $intersect };
#print STDERR "====>$k(" . join(",",sort keys %{ $intersect }) . "):$title:$key\n" if ($k > 1);
if ($k >= 3) {
print "$title\n" if ($titles{$title} > 0);
print "$key\n" x $titles{$key};
$titles{$key} = 0;
$titles{$title} = 0;
};
};
};
として保存します。例: blueray.pl
、およびchmod +x
で実行可能にします。
新しいサンプル入力が与えられると、次の出力が生成されます。
$ ./blueray.pl TestData.txt
7L: The Seven Levels of Communication
The Seven Levels of Communication: Go From Relationships to Referrals by Michael J. Maher
A History of Money and Banking in the United States: The Colonial Era to World War II
The History of Banking: The History of Banking and How the World of Finance Became What it is Today
America's Bank: The Epic Struggle to Create the Federal Reserve
America's Money Machine: The Story of the Federal Reserve
Freakonomics: A Rogue Economist
Freakonomics: A Rogue Economist Explores the Hidden
Freakonomics: A Rogue Economist Explores the Hidden
Freakonomics: A Rogue Economist Explores the Hidden Side of Everything by Steven Levitt
Money Master the Game by Tony Robbinson
Money Master the Game by Tony Robbinson
Money Master the Game by Tony Robbinson
The Federal Reserve and its Founders: Money, Politics, and Power
The Power and Independence of the Federal Reserve
Venture Deals by Brad Feld
Venture Deals by Brad Feld & Jason Mendelson
Zen and the Art of Motorcycle Maintenance: An Inquiry into Values
Zen and the Art of Motorcycle Maintenance: An Inquiry into Values
これは、出力例とまったく同じではありません。正確な順序を無視してタイトル内の一般的な単語の存在をチェックするため、誤検知を見つける可能性が高く、一致を見逃す可能性が低くなります。すべきではありません(偽陰性)。
これを試してみたい場合、または一致している(またはほぼ一致している)単語を確認したい場合は、#print STDERR
行のコメントを解除できます。