修正する:行番号の要件を明確にし、いくつかの長い内容を減らします。
コマンドラインで次の方法がありますか?
- 英語のテキストファイルの確認
- 繰り返し単語のスペルミスを見つけてください。
- そして見つかった行番号、
問題を修正するのに役立ちますか?
実施例1
現在の記事やその他の英語の作文を助けて、aspell -c text.txt
スペルミスを見つけるのに役立ちます。しかし、間違いが意図せずに単語を連続的に繰り返す場合は役に立ちません。
highlander_typo.txt
:
There can be only one one.
ランニングaspell
:
$ aspell -c highlander_typo.txt
おそらくaspell
これは文法チェッカーではなくスペルチェッカーであるため、スペルが間違っている単語を繰り返すことは意図された機能の範囲外です。したがって、aspell
個々の単語のスペルに関する限り、「エラー」がないため、ファイルはスキャンに合格します。
正しい文はThere can be only one.
、2番目one
は、意図しない繰り返し単語のスペルエラーです。
実施例2
ただし、別のケースは次のとおりですkylie_minogue.txt
。
La la la
ここで繰り返すのは作家の一部なので、タイプミスではありません。歌詞。
したがって、解決策はそれ自体何も仮定し、「修正」してはいけません。それ以外の場合は、意図的に繰り返される単語を上書きできます。
例 3: 複数行
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行から
- 1: で
He has has refused
なければなりませんHe has refused
。 2つ目はhas
繰り返しの単語スペルミスです。 - 5: で
should be be obtained
なければなりませんshould be obtained
。 2つ目はbe
繰り返しの単語スペルミスです。
しかし、3番目に繰り返される単語のスペルが間違っていることを発見しましたか?
- サム:
... immediate and
- 4:
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
したがって、解決策がこれとまったく似ていなくても心配しないでください。
ただし、上記のように次のように表示されることを願っています。
- 関連した生入力の行番号
- 繰り返しの内容に注意を集中させる方法で、テキスト行が長すぎる場合に特に便利です。
- コンテキストを提供するために行全体が表示される場合(出典:@Wildcard)、繰り返し単語を一意の方法でレンダリングする方法が必要です。ここに示す例では、重複項目をASCII文字で囲んで表示します
[
]
。あるいは、grep --colors=always
カラー端末に表示するために線を模倣した一致を色付けすることもできる。
その他の考慮事項
- テキストはプレーンテキストファイルとして残す必要があります。
- GUIソリューションを提供せず、テキストソリューションのみを提供してください。
ssh -X
X11転送は信頼できないため、再編集する必要があります。ssh
失敗した試み
重複した単語を見つけようとする考えがあったuniq
ので、最初に重複した単語認識が一行で機能するようにする方法を調べることが計画でした。
使用する前に、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
処理後に再度追加するのかわかりません。
これは失敗しました。ただし、成功した場合は、行の行番号を含める方法が必要です。入力ファイルに数百行がある可能性があるため、これは入力ファイルのどの行で重複する単語が検出されたかを示すのに役立ちます。
この1行処理は、おそらくファイル内のすべての行を処理できるように、1行ごとに複数行処理を実行する親ループの一部です。しかし、残念ながら1行を超えても重複する単語認識が問題になりました。
答え1
編集する:インストールとデモの追加
次の極端なケースを少なくとも処理する必要があります。
- 行の終わり(および開始)で単語を繰り返します。
- が頻繁に表示されるため、検索時に大文字と小文字を区別する必要があります
The the apple
。 - おそらく、検索を単語のコンポーネントに制限することで
( ( a + b) + c )
(繰り返し開くかっこと一致しない可能性があります)。 - 完全な単語だけを一致させることで削除できます。
the thesis
- 人間の言語では、単語のUnicode文字を正しく解釈する必要があります。
おおむね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
上記はテキストキャプチャだけですが、色をサポートする端末では一致するものに色が割り当てられます。
- はいはい
- そして
- そして
- はいはい
答え2
これにより、繰り返しの単語(ファイル名と行番号を含む)を含む行が印刷されます。
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
答え3
尊敬する人に会わなければならないdiction(1)
そしてstyle(1)
注文する。彼らはいろいろな種類の野生を受けました。新しいバージョンがあります(Fedora 23のGPLv3)。
インストールする
たとえば、Debianベースのディストリビューションでは、以下をdiction
含むパッケージをインストールしますstyle
。
$ sudo apt-get install diction
少なくともFedoraでは次のようになります。
$ dnf install diction
Red Hat Enterprise Edition(およびクローン)には、次のものが必要な場合があります。
$ 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です。ここでは、lineで始まる文の一部であるため3
にのみ表示されます。だからこれはあなたが望むものとは少し異なります[be]
3
答え4
質問にタグを付けたので、ただ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
、お好みに合わせて調整してください。