GNU/Linux >> Belajar Linux >  >> Linux

Temukan N Kata Paling Sering Dalam Sebuah File?

Saya ingin menemukan, katakanlah, 10 kata paling umum dalam file teks. Pertama, solusi harus dioptimalkan untuk penekanan tombol (dengan kata lain – waktu saya). Kedua, untuk performanya. Inilah yang saya miliki sejauh ini untuk mendapatkan 10 besar:

cat test.txt | tr -c '[:alnum:]' '[n*]' | uniq -c | sort -nr | head  -10
  6 k
  2 g
  2 e
  2 a
  1 r
  1 k22
  1 k
  1 f
  1 eeeeeeeeeeeeeeeeeeeee
  1 d

Saya dapat membuat program java, python, dll. tempat saya menyimpan (Word, numberOfOccurences) dalam kamus dan mengurutkan nilainya atau saya dapat menggunakan MapReduce, tetapi saya mengoptimalkan penekanan tombol.

Apakah ada positif palsu? Apakah ada cara yang lebih baik?

Jawaban yang Diterima:

Itu adalah cara paling umum untuk menemukan “N hal yang paling umum”, kecuali Anda kehilangan sort , dan Anda mendapatkan cat yang murah hati :

tr -c '[:alnum:]' '[n*]' < test.txt | sort | uniq -c | sort -nr | head  -10

Jika Anda tidak memasukkan sort sebelum uniq -c Anda mungkin akan mendapatkan banyak kata-kata tunggal yang salah. uniq hanya menjalankan garis yang unik, bukan keunikan keseluruhan.

EDIT: Saya lupa trik, "hentikan kata-kata". Jika Anda melihat teks bahasa Inggris (maaf, satu bahasa Amerika Utara di sini), kata-kata seperti "dari", "dan", "yang" hampir selalu menempati dua atau tiga tempat teratas. Anda mungkin ingin menghilangkannya. Distribusi GNU Groff memiliki file bernama eign di dalamnya yang berisi daftar kata berhenti yang cukup baik. Distro Arch saya memiliki /usr/share/groff/current/eign , tapi sepertinya saya juga pernah melihat /usr/share/dict/eign atau /usr/dict/eign di Unix lama.

Anda dapat menggunakan stopword seperti ini:

tr -c '[:alnum:]' '[n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head  -10

Dugaan saya adalah bahwa sebagian besar bahasa manusia membutuhkan "kata henti" serupa yang dihapus dari jumlah frekuensi kata yang bermakna, tetapi saya tidak tahu di mana harus menyarankan agar bahasa lain menghentikan daftar kata.

EDIT: fgrep harus menggunakan -w perintah, yang memungkinkan pencocokan seluruh kata. Hal ini untuk menghindari kesalahan positif pada kata-kata yang hanya berisi kalimat pemberhentian singkat, seperti “a” atau “i”.


Linux
  1. Bagaimana Menemukan Tanda Kurung yang Tak Tertandingi Dalam File Teks?

  2. Tidak Dapat Menemukan File Untuk Ditambal Pada Baris Input 3?

  3. Temukan N Kata Paling Sering Dalam File Dengan Daftar Kata Berhenti Dari Baris Perintah?

  1. Temukan File Log Firefox?

  2. Gunakan _roff Untuk Menggarisbawahi Kata?

  3. Dapatkan file terbaru di direktori di Linux

  1. Temukan file lalu cd ke direktori itu di Linux

  2. Menemukan file yang dapat dibaca manusia di unix

  3. Bagaimana menemukan kata-kata dari satu file di file lain?