Algoritma untuk mengklasifikasikan kata-kata untuk tingkat kesulitan algojo sebagai "Mudah", "Sedang", atau "Sulit"


114

Apa algoritme yang baik untuk menentukan "kesulitan" sebuah kata untuk permainan algojo, sehingga game dapat memilih kata yang cocok dengan tingkat kesulitan yang ditentukan?

Kesulitan tampaknya terkait dengan jumlah tebakan yang diperlukan, frekuensi relatif penggunaan huruf (misalnya, kata dengan banyak huruf yang tidak umum mungkin lebih sulit ditebak), dan kemungkinan panjang kata.

Ada juga beberapa faktor subjektif untuk (berusaha) dikompensasikan, seperti kemungkinan sebuah kata ada dalam kosakata pemain, dan dapat dikenali, memungkinkan berpindah dari strategi menebak berdasarkan frekuensi huruf saja ke menebak berdasarkan daftar kata-kata yang cocok yang dikenal.

Upaya saya untuk saat ini ada di bawah ruby. Ada saran tentang cara meningkatkan kategorisasi?

def classify_word(w)
  n = w.chars.to_a.uniq.length # Num. unique chars in w
  if n < 5 and w.length > 4
    return WordDifficulty::Easy
  end
  if n > w.length / 2
    return WordDifficulty::Hard
  else
    return WordDifficulty::Medium
  end
end

Saya sedang menulis permainan algojo yang saya ingin anak-anak saya mainkan; Saya agak terlalu tua untuk mencoba "pekerjaan rumah", yang mungkin menjadi alasan mengapa pertanyaannya menerima begitu banyak suara negatif ... Kata-kata diambil secara acak dari database kata besar, yang mencakup banyak kata yang tidak jelas, dan disaring oleh tingkat kesulitan ditentukan untuk kata tersebut.


12
Mengapa suara negatif? Ini pertanyaan yang bagus. Saya akan membuat fungsi kesulitan seperti f(w) = (# unique letters) * (7 - # vowels) * (sum of the positions of unique letters in a list, ordered by frequency). Dari sana, Anda dapat membagi rentang fungsi menjadi tiga segmen dan menyebutnya sebagai kesulitan Anda.
Blender

2
Saya akan menyarankan Anda melakukan pencarian web untuk ini - kemungkinan ada algoritma atau kamus yang dimaksudkan untuk menghitung / melaporkan kompleksitas kata tersebut. Saya tahu ada teks yang lebih panjang.
Hot Licks

3
Terkait: youtube.com/watch?v=bBLm9P-ph6U (QI XL - Kata Tersulit untuk Ditebak di Hangman)
Claus Jørgensen

5
Apa pun yang Anda lakukan, pastikan untuk menyertakan EXTINCTIONSPECTROPHOTOPOLERISCOPEOCCULOGRAVOGYROKYNETOMETER.
Hot Licks

2
Untuk pengguna yang mungkin tidak terbiasa dengan Ruby, mungkin Anda ingin menjelaskan apa fungsi baris pertama dari metode Anda? n = w.chars.to_a.uniq.lengthApakah itu menghitung jumlah huruf unik?
T Nguyen

Jawaban:


91

1. Perkenalan

Berikut adalah cara untuk mendekati masalah ini secara sistematis: jika Anda memiliki algoritme yang dapat memainkan algojo dengan baik, maka Anda dapat menganggap kesulitan setiap kata untuk menjadi jumlah tebakan yang salah yang akan dilakukan oleh program Anda jika menebak kata itu.

2. Selain strategi algojo

Ada gagasan yang tersirat dalam beberapa jawaban dan komentar lain, bahwa strategi optimal untuk pemecah adalah mendasarkan keputusan mereka pada frekuensi huruf dalam bahasa Inggris, atau pada frekuensi kata dalam beberapa korpus. Ini adalah ide yang menggoda, tapi kurang tepat. Pemecah bekerja paling baik jika secara akurat memodelkan distribusi kata yang dipilih oleh penyetel , dan penyetel manusia mungkin memilih kata berdasarkan kelangkaannya atau menghindari huruf yang sering digunakan. Sebagai contoh, meskipun Eadalah surat yang paling sering digunakan dalam bahasa Inggris, jika setter selalu memilih dari kata-kata JUGFUL, RHYTHM, SYZYGY, dan ZYTHUM, kemudian pemecah sempurna tidak mulai dengan menebak E!

Pendekatan terbaik untuk memodelkan setter bergantung pada konteksnya, tetapi saya rasa beberapa jenis inferensi induktif Bayesian akan bekerja dengan baik dalam konteks di mana pemecah memainkan banyak permainan melawan setter yang sama, atau melawan sekelompok setter serupa.

3. Algoritma algojo

Di sini saya akan menjelaskan pemecah yang cukup bagus (tapi jauh dari sempurna). Ini memodelkan penyetel sebagai memilih kata-kata secara seragam dari kamus tetap. Ini adalah algoritma serakah : pada setiap tahap ia menebak huruf yang meminimalkan jumlah kesalahan, yaitu kata-kata yang tidak mengandung tebakan. Misalnya, jika sejauh ini tidak ada tebakan, dan kemungkinan kata-katanya adalah DEED, DEADdan DARE, maka:

  • jika Anda menebak Datau E, tidak ada kesalahan;
  • jika Anda menebak A, ada satu kesalahan ( DEED);
  • jika Anda menebak R, ada dua kesalahan ( DEEDdan DEAD);
  • jika Anda menebak surat lain, ada tiga kesalahan.

Jadi, Datau Emerupakan tebakan yang bagus dalam situasi ini.

(Terima kasih kepada Kolonel Panic dalam komentarnya karena menunjukkan bahwa tebakan yang benar gratis di hangman — saya benar-benar lupa ini dalam percobaan pertama saya!)

4. Implementasi

Berikut implementasi algoritma ini dengan Python:

from collections import defaultdict
from string import ascii_lowercase

def partition(guess, words):
    """Apply the single letter 'guess' to the sequence 'words' and return
    a dictionary mapping the pattern of occurrences of 'guess' in a
    word to the list of words with that pattern.

    >>> words = 'deed even eyes mews peep star'.split()
    >>> sorted(list(partition('e', words).items()))
    [(0, ['star']), (2, ['mews']), (5, ['even', 'eyes']), (6, ['deed', 'peep'])]

    """
    result = defaultdict(list)
    for word in words:
        key = sum(1 << i for i, letter in enumerate(word) if letter == guess)
        result[key].append(word)
    return result

def guess_cost(guess, words):
    """Return the cost of a guess, namely the number of words that don't
    contain the guess.

    >>> words = 'deed even eyes mews peep star'.split()
    >>> guess_cost('e', words)
    1
    >>> guess_cost('s', words)
    3

    """
    return sum(guess not in word for word in words)

def word_guesses(words, wrong = 0, letters = ''):
    """Given the collection 'words' that match all letters guessed so far,
    generate tuples (wrong, nguesses, word, guesses) where
    'word' is the word that was guessed;
    'guesses' is the sequence of letters guessed;
    'wrong' is the number of these guesses that were wrong;
    'nguesses' is len(guesses).

    >>> words = 'deed even eyes heel mere peep star'.split()
    >>> from pprint import pprint
    >>> pprint(sorted(word_guesses(words)))
    [(0, 1, 'mere', 'e'),
     (0, 2, 'deed', 'ed'),
     (0, 2, 'even', 'en'),
     (1, 1, 'star', 'e'),
     (1, 2, 'eyes', 'en'),
     (1, 3, 'heel', 'edh'),
     (2, 3, 'peep', 'edh')]

    """
    if len(words) == 1:
        yield wrong, len(letters), words[0], letters
        return
    best_guess = min((g for g in ascii_lowercase if g not in letters),
                     key = lambda g:guess_cost(g, words))
    best_partition = partition(best_guess, words)
    letters += best_guess
    for pattern, words in best_partition.items():
        for guess in word_guesses(words, wrong + (pattern == 0), letters):
            yield guess

5. Contoh hasil

Menggunakan strategi ini dimungkinkan untuk mengevaluasi kesulitan menebak setiap kata dalam sebuah koleksi. Di sini saya mempertimbangkan kata enam huruf dalam kamus sistem saya:

>>> words = [w.strip() for w in open('/usr/share/dict/words') if w.lower() == w]
>>> six_letter_words = set(w for w in words if len(w) == 6)
>>> len(six_letter_words)
15066
>>> results = sorted(word_guesses(six_letter_words))

Kata-kata yang paling mudah ditebak dalam kamus ini (bersama dengan urutan tebakan yang dibutuhkan pemecah untuk menebaknya) adalah sebagai berikut:

>>> from pprint import pprint
>>> pprint(results[:10])
[(0, 1, 'eelery', 'e'),
 (0, 2, 'coneen', 'en'),
 (0, 2, 'earlet', 'er'),
 (0, 2, 'earner', 'er'),
 (0, 2, 'edgrew', 'er'),
 (0, 2, 'eerily', 'el'),
 (0, 2, 'egence', 'eg'),
 (0, 2, 'eleven', 'el'),
 (0, 2, 'enaena', 'en'),
 (0, 2, 'ennead', 'en')]

dan kata-kata yang paling sulit adalah ini:

>>> pprint(results[-10:])
[(12, 16, 'buzzer', 'eraoiutlnsmdbcfg'),
 (12, 16, 'cuffer', 'eraoiutlnsmdbpgc'),
 (12, 16, 'jugger', 'eraoiutlnsmdbpgh'),
 (12, 16, 'pugger', 'eraoiutlnsmdbpcf'),
 (12, 16, 'suddle', 'eaioulbrdcfghmnp'),
 (12, 16, 'yucker', 'eraoiutlnsmdbpgc'),
 (12, 16, 'zipper', 'eraoinltsdgcbpjk'),
 (12, 17, 'tuzzle', 'eaioulbrdcgszmnpt'),
 (13, 16, 'wuzzer', 'eraoiutlnsmdbpgc'),
 (13, 17, 'wuzzle', 'eaioulbrdcgszmnpt')]

Alasan mengapa ini sulit adalah karena setelah Anda menebak -UZZLE, Anda masih memiliki tujuh kemungkinan tersisa:

>>> ' '.join(sorted(w for w in six_letter_words if w.endswith('uzzle')))
'buzzle guzzle muzzle nuzzle puzzle tuzzle wuzzle'

6. Pilihan daftar kata

Tentu saja saat menyiapkan daftar kata untuk anak-anak Anda, Anda tidak akan memulai dengan kamus sistem komputer Anda, Anda akan mulai dengan daftar kata yang menurut Anda mungkin mereka ketahui. Misalnya, Anda mungkin melihat daftar kata-kata yang paling sering digunakan di berbagai korpora bahasa Inggris di Wiktionary .

Misalnya, di antara 1.700 kata enam huruf dalam 10.000 kata yang paling umum di Proyek Gutenberg pada tahun 2006 , sepuluh kata yang paling sulit adalah:

[(6, 10, 'losing', 'eaoignvwch'),
 (6, 10, 'monkey', 'erdstaoync'),
 (6, 10, 'pulled', 'erdaioupfh'),
 (6, 10, 'slaves', 'erdsacthkl'),
 (6, 10, 'supper', 'eriaoubsfm'),
 (6, 11, 'hunter', 'eriaoubshng'),
 (6, 11, 'nought', 'eaoiustghbf'),
 (6, 11, 'wounds', 'eaoiusdnhpr'),
 (6, 11, 'wright', 'eaoithglrbf'),
 (7, 10, 'soames', 'erdsacthkl')]

(Soames Forsyte adalah karakter dalam Forsyte Saga oleh John Galsworthy ; daftar kata telah diubah menjadi huruf kecil jadi tidak mungkin bagi saya untuk menghapus nama yang tepat dengan cepat.)


1
Panggilan yang bagus untuk daftar kata yang sering digunakan. invokeit.wordpress.com/frequency-word-lists memiliki bahasa Inggris, dan Swedia, sangat senang memiliki keduanya.
grrussel

1
Saya berharap bingleuntuk dinilai lebih keras dari singleatau tingle- bingleadalah kata yang kurang umum dan b merupakan huruf yang kurang umum
BlueRaja - Danny Pflughoeft

5
Algoritma keren (dan terima kasih telah menjelaskan dalam bahasa Inggris sebelum menulis kode!). Tetapi saya pikir Anda harus mencoba meminimalkan jumlah tebakan yang salah . Jadi, jika kamusnya [bat, bet, hat, hot, yum], saya akan menebak 'T' (daripada B, A atau H). Jika saya benar, tidak ada biaya apapun bagi saya. Jika saya salah, maka hanya 'yum' yang tersisa.
Kolonel Panic

8
Ini adalah algoritme yang sangat keren, tetapi menurut saya tidak mencerminkan strategi yang cenderung dilakukan pemain manusia - alih-alih mengetahui setiap kata, manusia akan mengenali (secara probabilistik) kata-kata yang paling umum, dan sebaliknya akan mencoba mengenali cukup dan prefiks (seperti ion, ing) dan gagal yang hanya menebak huruf biasa (dimulai dengan vokal, lalu lakukan t / r / s / n / etc). Tidak yakin bagaimana membuat kode ini, tetapi ini adalah sesuatu yang harus dipikirkan :)
Patashu

2
Analisis yang bagus. Seperti yang ditunjukkan @Patashu, langkah selanjutnya untuk membuatnya lebih baik adalah daripada hanya mengambil kamus kata-kata umum, mengambil kamus lengkap kata-kata tetapi dengan anotasi tentang kesamaan, dan secara heuristik menimbang kesamaan kata dengan kesulitan distribusi surat. Tapi itu hanya untuk perbaikan opsional - ini sudah merupakan solusi yang sangat baik.
Ben Lee

21

Cara yang sangat sederhana adalah menghitung skor berdasarkan kurangnya vokal dalam kata, jumlah huruf unik, dan kesamaan setiap huruf:

letters = 'etaoinshrdlcumwfgypbvkjxqz'
vowels = set('aeiou')

def difficulty(word):
    unique = set(word)
    positions = sum(letters.index(c) for c in word)

    return len(word) * len(unique) * (7 - len(unique & vowels)) * positions

words = ['the', 'potato', 'school', 'egypt', 'floccinaucinihilipilification']

for word in words:
    print difficulty(word), word

Dan hasilnya:

432 the
3360 potato
7200 school
7800 egypt
194271 floccinaucinihilipilification

Anda kemudian dapat menilai kata-kata tersebut dengan:

        score < 2000   # Easy
 2000 < score < 10000  # Medium
10000 < score          # Hard

Hai blender, bisa tolong beri tahu saya untuk apa angka ajaib 7 itu? Mengapa tidak 6 atau 50? Apa yang Terjadi jika saya memasukkan nomor arbriter lain?
Pavan

@Pavan: Tidak ada yang benar-benar. Skor semua kata akan digeser ke atas dengan jumlah yang sama.
Blender

ya saya perhatikan pergeseran ketika saya bermain-main dengan eksekutif python online. Saya melihat sesuatu dan saat itulah saya mengetik sesuatu yang seperti fantastical dibandingkan dengan yang menjijikkan, hal yang menjijikkan akan memiliki nilai yang lebih rendah daripada fantastical meskipun fantastical menjadi kata yang dieja dengan lebih tepat sehingga seharusnya muncul dalam tingkat kesulitan yang lebih rendah dalam sebuah permainan kata. Ini membuat saya menyadari bahwa kesulitan itu subyektif tetapi saya berpikir bahwa harus ada semacam penelitian yang dilakukan untuk menguraikan kata-kata mana yang paling sulit dieja daripada yang lain, bukan? Bisakah Anda mengarahkan saya ke studi seperti itu?
Pavan

Atau setidaknya studi seperti itu akan disebut karena saya mengalami kesulitan menemukan kumpulan kata dengan persentase orang yang salah mengeja kata pada upaya pertama - itulah yang saya cari sekarang.
Pavan

9

Anda dapat menggunakan Metode Monte Carlo untuk memperkirakan tingkat kesulitan sebuah kata:

  • Simulasikan permainan dengan menebak huruf acak setiap kali, ditimbang dengan frekuensi huruf dalam bahasa target Anda, dan hitung berapa banyak tebakan yang dibutuhkan pemain acak Anda untuk sampai pada solusi. Perhatikan bahwa karena setiap tebakan menghilangkan satu huruf, proses ini terbatas, dan mengembalikan angka dari 1 hingga 26, inklusif.
  • Ulangi proses ini 2*Nkali, di mana Njumlah huruf unik di kata Anda,
  • Hitung skor dengan rata-rata hasil 2*Nlari,
  • Tentukan tingkat kompleksitas: skor kurang dari sepuluh menunjukkan kata yang mudah, dan skor di atas enam belas menunjukkan kata yang sulit; yang lainnya adalah medium.

2
Saya pikir Anda harus menghitung hanya tebakan yang salah . Tidak ada penalti untuk tebakan yang benar.
Kolonel Panic

Mengapa jumlah itu berulang? Saya pikir strategi ini (seperti kebanyakan strategi acak) memiliki variasi yang lebih besar untuk kata-kata yang lebih pendek .
Kolonel Panic

@ColonelPanic Saya pikir menghitung jumlah tebakan lebih baik, karena secara alami menggabungkan jumlah huruf yang berbeda ke dalam jawaban. Anda mungkin benar tentang variasi pada kata-kata yang lebih pendek menjadi lebih tinggi. Mungkin jumlah pengulangan harus diperbaiki. Namun, saya pikir 2N akan menjadi awal yang baik.
dasblinkenlight

4

Diskusi serupa sebelumnya sekitar topik yang sama: Menentukan kesulitan kata bahasa Inggris

Saya suka jawabannya di akhir tautan ^. Untuk permainan algojo anak-anak, cukup terapkan pendekatan seperti yang dilakukan scrabble.

Tetapkan nilai poin untuk setiap huruf, lalu tambahkan huruf-hurufnya.


1
Ini, bersama-sama dengan menghindari kata-kata langka atau tidak jelas pada tingkat yang mudah, tampaknya seperti jalan ke depan untuk saat ini. Kerumitan yang tidak saya sebutkan adalah bahwa kata-kata tersebut dipilih dari kamus-kamus besar, yang sebagian besar menurut definisi pasti kata-kata yang jarang digunakan :-)
grrussel

Nilai poin bisa berfungsi, kemungkinan besar menggunakan frekuensi huruf . Meskipun, beberapa kata yang umum digunakan mungkin sebenarnya memiliki nilai poin yang sangat tinggi.
Nuklir

3

Beberapa waktu yang lalu saya menulis pemecah algojo menggunakan algoritma yang jelas: diberi kamus awal dari semua kata yang mungkin, di setiap giliran kami memilih huruf yang terjadi di sebagian besar kata yang tersisa di kamus, kemudian menghapus kata-kata yang tidak cocok (tergantung pada respon) dari kamus.

Algoritme ini tidak sesederhana ini, karena sering kali ada beberapa huruf yang masing-masing muncul dalam jumlah kata yang sama di kamus. Dalam hal ini, pilihan huruf dapat membuat perbedaan yang signifikan pada berapa banyak tebakan yang diperlukan untuk sebuah kata. Kita pilih maxima dimana informasi yang dihasilkan tentang penempatan huruf itu (jika memang ada di kata) memberikan informasi yang maksimal tentang sistem (huruf dengan entropi informasi yang maksimal ). Misalnya jika dua kemungkinan kata tersisa adalah 'ensiklopedia' dan 'ensiklopedia', huruf 'c' memiliki kemungkinan yang sama untuk muncul sebagai e, n, y, l, o, p, e, d, i (yaitu dijamin ada dalam kata), tetapi kita harus bertanya tentang 'c' terlebih dahulu karena ia memiliki entropi informasi bukan nol.

Sumber (C ++, GPL) ada di sini

Hasil dari semua ini adalah daftar kata, dengan jumlah tebakan yang diperlukan untuk masing-masing: kesulitan.txt (630KB). Kata yang paling sulit ditemukan oleh algoritme ini adalah "akan" (dengan 14 tebakan gagal); i dan double l dapat ditebak dengan cukup cepat, tetapi kemudian opsi termasuk bill, dill, fill, gill, hill, kill, mill, pill, rill, till, will, dan sejak saat itu satu-satunya pilihan adalah menebak setiap huruf dalam belok. Agak berlawanan dengan intuisi, kata-kata yang lebih panjang jauh lebih cepat ditebak (hanya saja tidak ada yang bisa dipilih).

Tentu saja, dalam permainan algojo manusia, psikologi (dan luasnya kosakata) memainkan peran yang jauh lebih besar daripada yang dijelaskan oleh algoritme ini ...


3

Lakukan saja! Mainkan algojo melawan kata. Hitung berapa banyak kekalahan (mis. Tebakan yang salah) yang diperlukan untuk mengalahkan.

Anda membutuhkan strategi untuk bermain. Inilah strategi manusia (ish). Dari kamus, coret semua kata yang sejauh ini tidak sesuai dengan ungkapan. Tebak huruf yang paling sering di antara kata-kata yang tersisa.

Jika strategi Anda diacak, Anda dapat menentukan ukuran Anda sebagai perkiraan jumlah kekalahan, dan memperkirakannya secara empiris.


Strategi deterministik lainnya, dari bot hangman yang saya tulis beberapa tahun lalu. Tebak huruf yang meminimalkan jumlah kata yang tersisa jika tebakannya salah (mis. Optimalkan kasus terburuk). Hari ini saya tidak menyukai strategi ini karena terlalu mekanis, saya lebih suka yang di atas.


Haha, saya hanya akan menyarankan hal yang sama. Tapi versi yang serius: tulis bot sederhana yang menebak menggunakan beberapa strategi sederhana, lalu jalankan itu berkali-kali atas kata-kata dari kamus.
Tikhon Jelvis

Ya itulah yang saya maksud!
Kolonel Panic

2

Pertama, tentu saja, Anda akan membuat daftar huruf unik. Kemudian urutkan berdasarkan frekuensi (dalam bahasa Inggris atau bahasa apa pun - ada daftar untuk ini ), dengan huruf yang lebih jarang memiliki tingkat kesulitan yang lebih tinggi.

Kemudian Anda perlu memutuskan apakah Anda menggabungkan skor dengan menambahkan, mengalikan, atau menggunakan skema lain.


(Sebenarnya, Anda mungkin tidak perlu mengurutkan berdasarkan frekuensi, tetapi cukup kumpulkan skor frekuensi. Meskipun mungkin penyortiran itu memberikan beberapa info lebih lanjut - patut dicoba untuk melihat apakah tampaknya melakukan sesuatu untuk Anda.)
Hot Licks

Dan Anda mungkin ingin menjelaskan kombo huruf - yaitu, jika ada Q hampir pasti ada U, dan U membuat Q lebih mungkin. Jadi mungkin masuk akal, misalnya, menganggap QU sebagai satu huruf, dari frekuensi POV.
Hot Licks

1

Anda mendapatkan suara negatif karena Anda meminta kami membuat algoritme yang sangat kompleks untuk Anda.

Mengapa Anda tidak membuat tiga larik (mudah, sedang, dan keras) dan mengisi masing-masing dengan ratusan kata? Ini akan memakan waktu sekitar 20 menit.

Saya berjanji anak-anak Anda akan bosan dengan hang man jauh sebelum mereka membakar beberapa ratus game ...: D


3
Tidak harus yang rumit. Misalnya lihat komentar Blender, misalnya. Jawaban Anda tidak benar-benar menjawab pertanyaan inti dan tidak terlalu berguna.
Tikhon Jelvis

4
“Mengapa Anda tidak membuat tiga array (mudah, sedang, dan keras) dan mengisi masing-masing dengan seratus atau lebih kata?”: Juga disebut metode “selesaikan masalah dengan mengasumsikan masalah sudah terpecahkan”.
Pascal Cuoq

Kritik diambil, terima kasih ... Saya kira dari sudut pandang akademis, Anda benar sekali, jawaban saya tidak menyelesaikan apa pun. Tetapi dari sudut pandang praktis, yaitu cara termudah untuk membuat permainan algojo untuk anak-anak Anda, jawaban saya memang menyelesaikannya, dengan murah dan cepat.
BBagi

1
@PascalCuoq Atau Anda bisa mengatakan ini adalah pendekatan untuk "memecahkan masalah dengan mengasumsikan manusia lebih baik dalam memilih daftar yang sesuai daripada algoritma". Mengingat bahwa penanya menginginkan permainan untuk anak-anak, tampaknya lebih baik bahwa "topi, kucing, matahari" ada dalam daftar yang mudah, dan "gambang, nihil, sekolah" ada dalam daftar yang sulit, bahkan jika itu mungkin ditemukan dengan lebih sedikit tebakan rata-rata.
Darren Cook

1
@PascalCuoq Tidak ada yang salah dengan melewati masalah yang kompleks melalui solusi sederhana jika Anda bisa lolos begitu saja. Tidak ada yang salah dengan membangun algoritme kompleks untuk kesenangan, tetapi solusi sederhana setidaknya patut disebutkan.
David

1

Nah, mungkin ada banyak hal yang terlibat:

  1. Seperti yang dikatakan semua orang, frekuensi huruf individu;
  2. Panjang kata pasti harus dihitung, tetapi tidak secara linier - kata yang panjang dapat membuat tebakan acak mengenai huruf-hurufnya, sedangkan kata yang pendek sulit didapat;
  3. Juga, kata-kata itu sendiri harus dipertimbangkan - "bipartite" mungkin adalah kata untuk orang-orang di SO, tapi mungkin tidak untuk populasi non teknis.

Sebenarnya, Anda bisa mencoba mengembangkan beberapa strategi , setengahnya untuk menentukan nilai sebuah kata, dan setengahnya lagi untuk mencoba memenangkan permainan. Kelompok terakhir akan berusaha memaksimalkan skor sedangkan kelompok pertama berusaha memperkecil skor. Setelah beberapa saat mungkin ada pola dan kemudian setengahnya untuk menentukan nilai sebuah kata dapat memberi Anda beberapa tolok ukur.


Frekuensi penggunaan sebuah kata adalah poin yang bagus. Upaya pertama saya berdasarkan penilaian huruf unik berdasarkan frekuensi yang diklaim "eutektik" adalah kata yang "mudah". Google ngrams storage.googleapis.com/books/ngrams/books/datasetsv2.html tampaknya akan membantu mengidentifikasi kata-kata yang umum digunakan saat ini.
grrussel

1

Mulailah dengan Daftar Kata dan Luncurkan pencarian Google untuk masing-masing Kata. Biarkan Jumlah Hit berfungsi sebagai Proksi (kasar) dari kesulitan istilah.

Dalam versi yang disempurnakan, Anda akan mengelompokkan kata-kata dengan sinonim Relasi Berdasarkan Tesaurus dan menentukan kata tersulit dari sebuah kategori dengan menghitung Hasil pencarian google.

Mengambil Gagasan dari n-Gram Selangkah lebih maju, kesulitan sebuah Word dapat dinilai dari frekuensi suku kata dalam prosa. Tergantung pada kualitas statistik suku kata, tentunya. Anda mungkin harus Membedakan antara Lexemes dan kata-kata Fungsi (determinator, konjungsi, dll.) Dan Normalisasi dengan jumlah suku kata di Word (Terasa seperti Berlebihan saat saya Menulis ...).


0

Saya suka ide membangun algoritme yang belajar dan berubah tergantung pada penggunanya. Pada awalnya, Anda dapat menerapkan salah satu algoritme yang disarankan untuk membuat daftar, lalu semakin banyak orang yang bermain, Anda menetapkan bobot untuk setiap kata tergantung pada jumlah tebakan (yang juga terus dilacak dan dihitung ). Hal ini mencegah masalah kata-kata yang kompleks tetapi populer untuk diberi peringkat yang sulit tetapi dikenal baik oleh orang-orang.


0

Hitung nilai setiap huruf dari sebuah kata di poin Scrabble: E = 1, D = 2, V = 4, X = 8 dan seterusnya. Jumlahkan dan bagi dengan jumlah huruf untuk mendapatkan nilai huruf rata-rata, dan gunakan untuk menilai kata. Hitung rata-rata untuk setiap kata dalam kamus besar, dan tentukan break point di antara kuartil. Sebut kata dalam kuartil terendah "mudah", kata di dua kuartil tengah "sedang", dan kata di kuartil tertinggi "sulit".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.