web-dev-qa-db-ja.com

行番号付きの繰り返し単語のタイプミスを見つけるためのコマンドラインメソッド

更新:行番号の要件を明確にし、冗長性をいくつか削減します

コマンドラインから、次の方法があります。

  • 英語のテキストのファイルを確認してください
  • 繰り返しを見つけるために-単語のタイプミス、
  • それらが見つかった行番号とともに、

それらを修正するのを助けるために?

例1

現在、記事やその他の英語の文章を完成させるために、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は意図しない繰り返しです-単語のタイプミス。

例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 refusedHe has refusedである必要があり、2番目のhasは繰り返しです-単語のタイプミス
  • 5:should be be obtainedshould be obtainedである必要があり、2番目のbeは繰り返しです-単語のタイプミス

しかし、3番目の繰り返し単語のタイプミスに気づきましたか?

  • 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)、繰り返される1つまたは複数の単語を何らかの方法で明確にレンダリングする方法が必要です。ここに示す例は、繰り返しをASCII文字[]で囲むことによってマークします。あるいは、grep --colors=alwaysを模倣して、行の一致を色付けして表示します。カラーターミナル

その他の考慮事項

  • テキスト、プレーンテキストファイルのままにする必要があります
  • gUIソリューションは必要ありません。テキストのみです。 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処理後に何らかの方法で句読点を追加し直します。

これは失敗しました。しかし、成功した場合は、次にこの行の行番号を含める方法が必要になります。入力ファイルには数百行が含まれる可能性があり、入力ファイルのどの行に繰り返し単語が検出されたかを示すのに役立つためです。オン。

この単一行のコード処理は、ある種の行ごとの複数行処理を実行し、ファイル内のすべての行を処理できるようにするために、おそらく親ループの一部になりますが、残念ながら単一行を超えてしまいます繰り返し-単語認識には問題がありました。

6
clarity123

編集:インストールとデモを追加

あなたは少なくともいくつかのエッジケースの世話をする必要があります

  • 行の終わり(および始まり)で繰り返される単語。
  • The the Appleなどのエラーが頻繁に発生するため、検索では大文字と小文字が区別されません。
  • おそらく、検索をWord構成要素のみに制限して、( ( 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

上記は単なるテキストキャプチャですが、色がサポートされている端末では、一致は色分けされています。

  • 持っている
  • そして
  • そして
  • ある
5
jimmij

由緒ある 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が表示されます。これはあなたが望んだものとは少し異なります
5
vonbrand

これは、繰り返される単語を含む行(ファイル名と行番号を含む)を出力します。

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
4
glenn jackman

これが私が終わったものです:

tr '[:space:]' '\n' < highlander_typo.txt | tr -d '[:punct:]' |
tr '[:upper:]' '[:lower:]' | uniq -D

それはGNU tr構文だと思います。

3
Bruce Ediger

この質問に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の改行は視覚的に役に立たないため保存しませんでしたが、好みに合わせて調整できます。

2
snth

フォンブランドの回答の補足として:コマンドラインツール「diction」

重複する単語のみを検索し、他のスタイル要素をオフにしたい場合は、次のようにすることができます。

diction -n file_to_scan.txt --file empty_file.txt

-nフラグは、組み込みのWordリストを無視するように指示します。ただし、Wordリストがないと機能しないため、--file empty_file.txt、 どこ empty_file.txtは空のファイルで、Wordのリストがnullになります。

したがって、唯一のことは、単語の繰り返しを認識することです。

1
user1754566