更新:行番号の要件を明確にし、冗長性をいくつか削減します
コマンドラインから、次の方法があります。
それらを修正するのを助けるために?
現在、記事やその他の英語の文章を完成させるために、aspell -c text.txt
はスペルミスを見つけるのに役立ちます。ただし、エラーが意図しない連続した単語の繰り返しである場合は役に立ちません。
highlander_typo.txt
:
There can be only one one.
実行中aspell
:
$ aspell -c highlander_typo.txt
おそらくaspell
はスペルチェッカーであり、文法チェッカーではないため、Wordのタイプミスを繰り返すと、意図した機能の範囲を超えてしまいます。したがって、結果として、このファイルはaspell
のチェックに合格します。これは、個々の単語のスペルに関して「間違った」ものは何もないためです。
正しい文は There can be only one.
、2番目のone
は意図しない繰り返しです-単語のタイプミス。
しかし、別の状況は、たとえばkylie_minogue.txt
です。
La la la
これらはアーティストの 歌詞 の一部であるため、ここでの繰り返しはタイプミスではありません。
したがって、ソリューションはそれ自体で何かを推定して「修正」するべきではありません。そうしないと、意図的に繰り返される単語が上書きされる可能性があります。
jefferson_typo.txt
:
He has has refused his Assent to Laws, the most wholesome and necessary
for the public good.
He has forbidden his Governors to pass Laws of immediate and
and pressing importance, unless suspended in their operation till his
Assent should be be obtained; and when so suspended, he has utterly
neglected to attend to them.
独立宣言 から変更
上記の6行で、
He has has refused
はHe has refused
である必要があり、2番目のhas
は繰り返しです-単語のタイプミスshould be be obtained
はshould be obtained
である必要があり、2番目のbe
は繰り返しです-単語のタイプミスしかし、3番目の繰り返し単語のタイプミスに気づきましたか?
... immediate and
and pressing ...
別の行にありますが、同じ英語の文の一部ですが、上の行の末尾には、次の行の先頭に誤って追加された単語があるため、これも単語の入力ミスです。テキストのパッセージの反対側に繰り返しがあるため、目で検出するのはかなり難しいです。
aspell -c
と同様のプロセスで、繰り返し単語を検出できるインタラクティブなプログラム、または、
行番号と疑わしい繰り返し単語を抽出できるスクリプトまたはコマンドの組み合わせ。この情報により、vim
などのエディターを使用して繰り返し単語にジャンプし、必要に応じて修正を加えることが容易になります。
上記の複数行のjefferson_typo.txt
を使用すると、目的の出力は次のようになります。
1: has has
3: and
4: and
5: be be
または:
1: He [has has] refused his Assent to Laws, the most wholesome and necessary
3: He has forbidden his Governors to pass Laws of immediate [and]
4: [and] pressing importance, unless suspended in their operation till his
5: Assent should [be be] obtained; and when so suspended, he has utterly
上記のand
繰り返しのように、行間または行間繰り返し単語の難しいケースをどのように表示するかは完全にわかりません。ソリューションがこれに正確に似ていなくても心配しないでください。
しかし、上記のように、次のように表示されることを願っています。
[
]
で囲むことによってマークします。あるいは、grep --colors=always
を模倣して、行の一致を色付けして表示します。カラーターミナルssh -X
X11転送は確実に利用できず、ssh
で編集する必要があります重複を見つけようとすると、uniq
が頭に浮かんだので、最初に繰り返し単語認識を1行で機能させる方法を最初に決定する計画でした。
uniq
を使用するには、最初に1行の単語を1行に1つの単語に変換する必要があります。
$ tr ' ' '\n' < highlander_typo.txt
There
can
be
only
one
one.
残念ながら:
$ tr ' ' '\n' < highlander_typo.txt | uniq -D
何もない。
これは、通常は重複を明らかにする-D
オプションの場合、入力は正確に重複行である必要があるためです。残念ながら、繰り返される単語one
の終わりのピリオド.
はこれを否定します。別の線のように見えます。このピリオドなどの任意の句読点をどのように回避するかわからないため、tr
処理後に何らかの方法で句読点を追加し直します。
これは失敗しました。しかし、成功した場合は、次にこの行の行番号を含める方法が必要になります。入力ファイルには数百行が含まれる可能性があり、入力ファイルのどの行に繰り返し単語が検出されたかを示すのに役立つためです。オン。
この単一行のコード処理は、ある種の行ごとの複数行処理を実行し、ファイル内のすべての行を処理できるようにするために、おそらく親ループの一部になりますが、残念ながら単一行を超えてしまいます繰り返し-単語認識には問題がありました。
編集:インストールとデモを追加
あなたは少なくともいくつかのエッジケースの世話をする必要があります
The the Apple
などのエラーが頻繁に発生するため、検索では大文字と小文字が区別されません。( ( a + b) + c )
(左括弧を繰り返す)に一致しないようにする必要があります。the thesis
全体として、私はpcregrep
ソリューションをお勧めします:
pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' file
明らかに、色と行番号(n
オプション)はオプションですが、通常はありがたいです。
Debianベースのディストリビューションでは、次の方法でインストールできます。
$ Sudo apt-get install pcregrep
jefferson_typo.txt
でコマンドを実行して、以下を確認します。
$ pcregrep -Min --color=auto '\b([^[:space:]]+)[[:space:]]+\1\b' jefferson_typo.txt
1:He has has refused his Assent to Laws, the most wholesome and necessary
3:He has forbidden his Governors to pass Laws of immediate and
and pressing importance, unless suspended in their operation till his
5:Assent should be be obtained; and when so suspended, he has utterly
上記は単なるテキストキャプチャですが、色がサポートされている端末では、一致は色分けされています。
由緒ある diction(1)
およびstyle(1)
コマンドをのぞいてみてください。彼らはさまざまなブーブーをキャッチします。新しいバージョンがあります(Fedora 23のGPLv3)。
たとえば、Debianベースのディストリビューションでは、diction
を含むパッケージstyle
をインストールします。
$ Sudo apt-get install diction
少なくともFedoraでは次のようになります。
$ dnf install diction
Red Hat Enterprise(およびクローン)には、おそらく以下が必要です。
$ yum install diction
いずれにせよ、これはアップストリームGNUパッケージと呼ばれる diction
から来るので、ほとんどどこでも同じように呼ばれるべきです。
$ diction jefferson_typo.txt
jefferson_typo.txt:1: He has [has] refused his Assent to Laws, the [most] wholesome and necessary for the public good.
jefferson_typo.txt:3: He has forbidden his Governors to pass Laws of immediate and [and] pressing importance, unless suspended in their operation till his Assent should be [be] obtained; and when [so] suspended, he has utterly neglected to attend to them.
2 phrases in 2 sentences found.
長所
短所
[]
マーキングを導入します。たとえば、[so]
は、 Strunkによるスタイルの要素 ごとに無関係と見なすことができるため、おそらくマークされています。 man diction
を参照[be]
は元の入力の5行目ですが、ここでは3
が[be]
行で始まる文の一部であるため、3
が表示されます。これはあなたが望んだものとは少し異なりますこれは、繰り返される単語を含む行(ファイル名と行番号を含む)を出力します。
for f in *.txt; do
Perl -ne 'print "$ARGV: $.: $_" if /\b(\w+)\W+\1/' "$f"
done
複数行のマッチングの場合、これがありますが、ファイル内で段落ごとに丸呑みされているため、行番号が失われます(これは、-00
オプションの効果です)。 2つの単語の間の\W+
は、改行を含む「単語以外」の文字を意味します。
Perl -00 -nE '
@matches = /\b((\w+)\W+\2)/g;
while (@matches) {
($match,$Word) = splice @matches, 0, 2;
say "dup: $match";
}
' jefferson_typo.txt
dup: has has
dup: and
and
dup: be be
これが私が終わったものです:
tr '[:space:]' '\n' < highlander_typo.txt | tr -d '[:punct:]' |
tr '[:upper:]' '[:lower:]' | uniq -D
それはGNU tr
構文だと思います。
この質問にawk
のタグを付けたので、awk
だけを使用してみませんか?
$ awk '
BEGIN{RS=FS="\\W+"}
$0==t{printf("%s:%s\t%s %s\n", FILENAME, FNR, t, $0)}
{t=$0}
' *.txt
highlander_typo.txt:6 one one
jefferson_typo.txt:3 has has
jefferson_typo.txt:29 and and
jefferson_typo.txt:42 be be
kylie_minogue.txt:3 la la
jefferson_typo.txt
の改行は視覚的に役に立たないため保存しませんでしたが、好みに合わせて調整できます。
フォンブランドの回答の補足として:コマンドラインツール「diction」
重複する単語のみを検索し、他のスタイル要素をオフにしたい場合は、次のようにすることができます。
diction -n file_to_scan.txt --file empty_file.txt
-n
フラグは、組み込みのWordリストを無視するように指示します。ただし、Wordリストがないと機能しないため、--file empty_file.txt
、 どこ empty_file.txt
は空のファイルで、Wordのリストがnullになります。
したがって、唯一のことは、単語の繰り返しを認識することです。