Adam asmaca zorluk seviyeleri için kelimeleri "Kolay", "Orta" veya "Zor" olarak sınıflandırmak için algoritma


114

Adam asmaca oyunu için bir kelimenin "zorluğunu" belirlemek için iyi bir algoritma nedir, böylece oyun belirli bir zorluk seviyesine uyacak kelimeleri seçebilir?

Zorluk, gerekli tahmin sayısı, harflerin göreli kullanım sıklığı (örneğin, pek çok nadir harf içeren kelimelerin tahmin edilmesi daha zor olabilir) ve potansiyel olarak kelimenin uzunluğu ile ilgili görünecektir.

Ayrıca, bir kelimenin oyuncunun sözlüğünde olma olasılığı gibi bazı öznel faktörler de vardır ve bunlar, yalnızca harf frekanslarına dayalı bir tahmin stratejisinden listeye dayalı tahminlere geçilmesine izin vererek fark edilebilir. bilinen eşleşen kelimeler.

Şimdilik girişimim Ruby'de aşağıda. Sınıflandırmanın nasıl geliştirileceğine dair herhangi bir öneriniz var mı?

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

Çocuklarımın oynamasını istediğim bir cellat oyunu yazıyorum; "Ev ödevi" yapmaya çalışmak için çok yaşlıyım, bu yüzden soru bu kadar çok olumsuz oy alıyor olabilir ... Kelimeler, pek çok belirsiz kelimeyi içeren büyük kelime veritabanlarından rasgele çekilir ve zorluk seviyesine göre filtrelenir kelime için belirlenir.


12
Neden olumsuz oylar? Bu iyi bir soru. Gibi bir zorluk işlevi yapardım f(w) = (# unique letters) * (7 - # vowels) * (sum of the positions of unique letters in a list, ordered by frequency). Oradan, işlevin aralığını üç bölüme ayırabilir ve bunlara zorluklarınız diyebilirsiniz.
Blender

2
Bunun için bir web araması yapmanızı öneririm - muhtemelen kelimenin karmaşıklığını hesaplama / rapor etme iddiasında olan algoritmalar veya sözlükler vardır. Daha uzun metinler olduğunu biliyorum.
Hot Licks

3
İlgili: youtube.com/watch?v=bBLm9P-ph6U (QI XL - Adam Asmaca'da Tahmin Edilmesi En Zor Kelime)
Claus Jørgensen 25'13

5
Ne yaparsanız yapın, EXTINCTIONSPECTROFOTOPOLERISCOPEOCCULOGRAVOGYROKYNETOMETER'ı eklediğinizden emin olun.
Hot Licks

2
Ruby'ye aşina olmayan kullanıcılar için, belki yönteminizin ilk satırının ne yaptığını açıklamak istersiniz? n = w.chars.to_a.uniq.lengthBenzersiz harflerin sayısını sayıyor mu?
T Nguyen

Yanıtlar:


91

1. Giriş

İşte bu soruna sistematik olarak yaklaşmanın bir yolu: Adam asmayı iyi oynayan bir algoritmanız varsa, o zaman her kelimenin zorluğunu programınızın o kelimeyi tahmin ederseniz alacağı yanlış tahminlerin sayısı olarak kabul edebilirsiniz.

2. Cellat stratejisi bir yana

Diğer bazı cevaplarda ve yorumlarda örtük bir fikir var, çözücü için en uygun stratejinin kararlarını İngilizce'deki harflerin sıklığına veya bazı derlemedeki kelimelerin sıklığına dayandırmak olacaktır. Bu baştan çıkarıcı bir fikir, ancak tam olarak doğru değil. Çözücü , ayarlayıcı tarafından seçilen kelimelerin dağılımını doğru bir şekilde modellerse en iyisini yapar ve bir insan belirleyici, kelimeleri nadirliklerine veya sık kullanılan harflerden kaçınmalarına göre seçebilir. Her ne kadar Örneğin, Eİngilizce olarak en sık kullanılan mektup, ayarlayıcı hep kelimelerinden seçerse JUGFUL, RHYTHM, SYZYGY, ve ZYTHUMdaha sonra mükemmel bir çözücüdür tahmin ederek başlamaz E!

Ayarlayıcıyı modellemeye yönelik en iyi yaklaşım bağlama bağlıdır, ancak sanırım bir tür Bayesçi tümevarımsal çıkarım, çözücünün aynı ayarlayıcıya veya bir grup benzer kurucuya karşı birçok oyun oynadığı bir bağlamda iyi sonuç verecektir.

3. Adam asmaca algoritması

Burada oldukça iyi (ama mükemmel olmaktan uzak) bir çözücüyü özetleyeceğim. Ayarlayıcıyı, sabit bir sözlükten tek tip olarak kelimeleri seçecek şekilde modeller. Bu bir var açgözlü algoritma : Her aşamada öyle özlüyor, tahmin içermeyen sözcük sayısını en aza indirir mektubu tahmin eder. Örneğin, şimdiye kadar hiçbir tahmin yapılmadıysa ve olası sözcükler DEED, DEADve DAREo zaman:

  • eğer tahmin ederseniz Dya da Eözledim yok;
  • tahmin ederseniz A, bir eksik var ( DEED);
  • tahmin ederseniz R, iki eksik ( DEEDve DEAD) vardır;
  • başka bir harf tahmin ederseniz, üç eksik var.

Yani ya Dya Ebu durumda iyi bir tahmindir.

( Adam asmada doğru tahminlerin ücretsiz olduğuna işaret ettiği için yorumlarda bulunan Albay Panic'e teşekkürler - bunu ilk denememde tamamen unuttum!)

4. Uygulama

İşte bu algoritmanın Python'da bir uygulaması:

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. Örnek sonuçlar

Bu stratejiyi kullanarak bir koleksiyondaki her kelimeyi tahmin etmenin zorluğunu değerlendirmek mümkündür. Burada sistem sözlüğümdeki altı harfli kelimeleri ele alıyorum:

>>> 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))

Bu sözlükte tahmin edilmesi en kolay sözcükler (çözücünün bunları tahmin etmesi için gereken tahmin dizisiyle birlikte) aşağıdaki gibidir:

>>> 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')]

ve en zor kelimeler bunlar:

>>> 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')]

Bunların zor olmasının nedeni, tahmin ettikten sonra -UZZLEhala yedi olasılığın kalmasıdır:

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

6. Kelime listesi seçimi

Elbette çocuklarınız için kelime listeleri hazırlarken, bilgisayarınızın sistem sözlüğüyle başlamazsınız, muhtemelen bileceklerini düşündüğünüz kelimelerin bir listesiyle başlarsınız. Örneğin, Vikisözlük'ün çeşitli İngilizce derlemelerde en sık kullanılan kelimelerin listelerine bakabilirsiniz .

Örneğin, 2006 yılı itibariyle Project Gutenberg'deki en yaygın 10.000 kelimede yer alan 1.700 altı harfli kelime arasında en zor on tanesi şunlar:

[(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, John Galsworthy tarafından yazılan Forsyte Saga'da bir karakterdir ; kelime listesi küçük harfe dönüştürüldü, bu yüzden özel isimleri hızlıca kaldırmam mümkün değildi.)


1
Sık kullanılan kelime listelerinde iyi bir çağrı. invokeit.wordpress.com/frequency-word-lists'de İngilizce ve İsveççe var, ikisine de sahip olmak çok güzel.
grrussel

1
Ben beklenir bingledaha sert puan edilecek singleveya tingle- bingledaha az yaygın bir kelime ve b daha az yaygın mektup
BlueRaja - Dany Pflughoeft

5
Harika algoritma (ve kodu yazmadan önce İngilizce olarak açıkladığınız için teşekkürler!). Ancak yanlış tahminlerin sayısını en aza indirmeye çalışmanız gerektiğini düşünüyorum . Dolayısıyla, sözlük [yarasa, bahis, şapka, ateşli, yum] olsaydı, sanırım 'T' (B, A veya H yerine). Eğer haklıysam, bana hiçbir maliyeti olmaz. Yanılıyorsam, geriye sadece 'yum' kalır.
Albay Panic

8
Bu gerçekten harika bir algoritma, ancak bence insan oyuncuların yapması gereken stratejiyi yansıtmıyor - her bir kelimeyi bilmek yerine, insanlar en yaygın kelimeleri (olasılığa dayalı olarak) tanıyacaklar ve aksi takdirde yeterli olanları ve önekler (ion, ing gibi) ve sadece ortak harfleri tahmin etmekte başarısız olmak (ünlülerle başlayıp sonra t / r / s / n / vb. yaparak). Emin değilim koduna bu ama onun bir şey :) düşünmek nasıl
Patashu

2
Harika analiz. @ Patashu'nun da belirttiği gibi, bunu daha da iyi hale getirmenin bir sonraki adımı, sadece ortak kelimelerin sözlüğünü almaktan ziyade, kelimelerin tam bir sözlüğünü almak, ancak ortaklıkla ilgili ek açıklamalarla ve basitçe sezgisel olarak kelimenin ortaklığını tartmak olacaktır. harf dağıtımı zorluğu. Ancak bu sadece isteğe bağlı iyileştirme içindir - bu haliyle zaten mükemmel bir çözümdür.
Ben Lee

21

Gerçekten basit bir yol, kelimedeki sesli harflerin olmamasına, benzersiz harflerin sayısına ve her harfin ortaklığına dayalı bir puan hesaplamak olabilir:

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

Ve çıktı:

432 the
3360 potato
7200 school
7800 egypt
194271 floccinaucinihilipilification

Daha sonra kelimeleri şu şekilde puanlayabilirsiniz:

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

Merhaba blender, lütfen bana 7 numaralı sihirli numaranın ne işe yaradığını söyleyebilir misiniz? Neden 6 ya da 50 değil? Başka bir keyfi numara koyarsam ne olur?
Pavan

@Pavan: Gerçekten bir şey yok. Tüm kelimelerin puanları aynı miktarda yukarı kaydırılacaktır.
Blender

evet, çevrimiçi bir python yürütücüsü ile oynarken değişimi fark ettim. Bir şeyi fark ettim ve tiksindirici ile karşılaştırıldığında fantastik gibi bir şey yazdığımda, tiksindirici, fantastik olmaktan daha düşük bir değere sahip olacak ve daha doğru yazılan bir kelime olduğu için bir kelime oyununda daha düşük bir zorluk seviyesinde görünmelidir. Bu, zorluğun öznel olduğunu anlamamı sağladı, ancak hangi kelimelerin diğerlerine göre hecelenmesinin en zor olduğunu belirlemek için bir tür çalışma yapılması gerektiğini düşünmemi sağladı, değil mi? Bana böyle bir çalışmaya işaret edebilir misiniz lütfen?
Pavan

Ya da en azından, ilk denemede kelimeyi yanlış heceleyen insanların yüzdesi ile bir kelime derlemesi bulmakta güçlük çektiğim için böyle bir çalışmanın adı ne olurdu - ki şimdi peşinde olduğum şey bu.
Pavan

9

Bir kelimenin zorluğunu tahmin etmek için Monte Carlo Yöntemini kullanabilirsiniz:

  • Her seferinde rastgele bir harf tahmin ederek, hedef dilinizdeki harfin sıklığına göre ağırlıklandırılarak bir oyunu simüle edin ve rastgele oyuncunuzun bir çözüme ulaşması için kaç tahmin gerektiğini sayın. Her tahmin bir harfi ortadan kaldırdığından, bu sürecin sonlu olduğunu ve 1'den 26'ya kadar bir sayı döndürdüğünü unutmayın.
  • Bu işlemi 2*Ndefalarca tekrarlayın , burada kelimenizdeki benzersiz harflerin Nsayısı ,
  • Koşuların sonuçlarının ortalamasını alarak puanı hesaplayın 2*N,
  • Karmaşıklık düzeyini belirleyin: ondan düşük puanlar kolay bir sözcüğü gösterir ve on altıdan yüksek puanlar zor bir sözcüğü gösterir; diğer her şey orta.

2
Sadece yanlış tahminleri saymanız gerektiğini düşünüyorum . Doğru tahmin etmenin cezası yoktur.
Albay Panic

Neden bu kadar sayıda tekrar var? Bence bu stratejinin (çoğu rastgele strateji gibi) daha kısa kelimeler için daha fazla varyansı var .
Albay Panic

@ColonelPanic Bence toplam tahmin sayısını saymanın daha iyi olduğunu düşünüyorum, çünkü doğal olarak cevaba farklı harflerin sayısını dahil ediyor. Daha kısa kelimelerin varyansının daha yüksek olması konusunda haklı olabilirsiniz. Belki de tekrar sayısı o zaman düzeltilmelidir. Ancak, 2N'nin iyi bir başlangıç ​​olacağını düşünüyorum.
dasblinkenlight

4

Aynı konuyla ilgili önceki benzer tartışma: İngilizce bir kelimenin zorluğunu belirleme

^ Bağlantısının sonundaki cevabı beğendim. Bir çocuk cellat oyunu için scrabble'ın yaptığı gibi bir yaklaşım uygulayın.

Her harfe bir puan değeri atayın, ardından harfleri ekleyin.


1
Bu, kolay seviyelerde nadir veya belirsiz kelimelerden kaçınmakla birlikte, şimdilik ileriye giden yol gibi görünüyor.
Bahsetmediğim

Nokta değerleri, büyük olasılıkla harf sıklığını kullanarak işe yarayabilir . Bununla birlikte, yaygın olarak kullanılan bazı kelimelerin aslında garip bir şekilde yüksek puan değerleri olabilir.
Nükleer Adam

3

Bir süre önce, bariz algoritmayı kullanarak bir cellat çözücü yazdım: olası tüm kelimelerin ilk sözlüğü verildiğinde, her dönüşte sözlükte kalan en çok kelimede geçen harfi seçer, ardından eşleşmeyen kelimeleri kaldırırız ( yanıt) sözlükten.

Sözlükte her biri aynı sayıda kelimede yer alan birkaç harf olduğundan, algoritma bu kadar basit değildir. Bu durumda, harf seçimi, bir kelime için kaç tahminin gerekli olduğu konusunda önemli bir fark yaratabilir. Bu mektubun yerleştirilmesi hakkında ortaya çıkan bilginin (eğer gerçekten kelime içindeyse) sistem hakkında maksimum bilgiyi (maksimum bilgi entropisine sahip harf) verdiği maksimumları seçiyoruz . Örneğin, kalan iki olası kelime 'ansiklopedi' ve 'ansiklopedik' ise, 'c' harfi e, n, y, l, o, p, e, d, i ile aynı görünme olasılığına sahiptir (yani kelimede olması garantilidir), ancak sıfır olmayan bir bilgi entropisine sahip olduğu için önce 'c' hakkında sormalıyız.

Kaynak (C ++, GPL) burada

Bütün bunlar sonucunda her biri için gerekli tahminlerin sayısı ile, kelimelerin bir listesidir difficulty.txt (630KB). Bu algoritma için bulması en zor kelime "will" dir (14 başarısız tahminle); i ve çift l çok hızlı tahmin edilir, ancak seçenekler arasında fatura, dereotu, dolgu, solungaç, tepe, öldürme, değirmen, hap, dereotu, kadar, olacak ve o andan itibaren tek seçenek her harfi tahmin etmektir. çevirin. Biraz mantığa aykırı bir şekilde, daha uzun kelimeler çok daha hızlı tahmin edilir (sadece aralarından seçim yapabileceğiniz bir şey yoktur).

Elbette, insan asmaca oyununda psikoloji (ve kelime dağarcığı) bu algoritmanın açıkladığından çok daha büyük bir rol oynar ...


3

Sadece yap! Cellat kelimesine karşı oyna. Yenmek için kaç mağlubiyet (yani yanlış tahminler) gerektiğini sayın.

Oynamak için bir stratejiye ihtiyacınız olacak. İşte bir insan (imsi) stratejisi. Sözlükten şu ana kadar ortaya çıkarılanlara uymayan tüm kelimeleri çıkarın. Kalan kelimeler arasında en sık kullanılan harfi tahmin edin.

Stratejiniz rastgele seçilmişse, ölçünüzü beklenen kayıp sayısı olarak tanımlayabilir ve bunu ampirik olarak tahmin edebilirsiniz.


Başka bir deterministik strateji, birkaç yıl önce yazdığım cellat botundan . Tahminin yanlış olması durumunda kalan kelime sayısını en aza indiren harfi tahmin edin (yani en kötü durumu optimize edin). Bugün çok mekanik olduğu için bu stratejiden hoşlanmıyorum, yukarıdakini tercih ediyorum.


Haha, ben de aynı şeyi önerecektim. Ama ciddi bir versiyon: basit bir strateji kullanarak tahmin eden basit bir bot yazın, sonra bunu bir sözlükteki kelimelerin üzerinde defalarca çalıştırın.
Tikhon Jelvis

Evet, demek istediğim buydu!
Albay Panic

2

İlk olarak, elbette, benzersiz harflerden oluşan bir liste oluşturursunuz. Daha sonra sıklığa göre sıralayın (İngilizce veya herhangi bir dilde - bunun için listeler var ), daha az sıklıkta olan harflerin daha fazla zorluk çekmesini sağlayın.

Ardından, puanları ekleyerek, çarparak veya başka bir şema kullanarak birleştirip birleştirmeyeceğinize karar vermeniz gerekir.


(Aslında, sıklığa göre sıralamanız gerekmeyebilir , ancak sadece frekans puanlarını biriktirebilirsiniz. Bu sıralama daha fazla bilgi
sağlasa da

Ve bir şekilde harf kombinasyonlarını hesaba katmak isteyebilirsiniz - yani, eğer bir Q varsa, neredeyse kesinlikle bir U vardır ve bir U, bir Q'yu çok daha muhtemel kılar. Dolayısıyla, örneğin QU'yi bir frekans POV'undan tek bir harf olarak kabul etmek mantıklı olabilir.
Hot Licks

1

Bizden sizin için çok karmaşık bir algoritma oluşturmamızı istediğiniz için olumsuz oy alıyorsunuz.

Neden sadece üç dizi oluşturmuyorsunuz (kolay, orta ve zor) ve her birini yüz kadar kelime ile doldurmuyorsunuz? Yaklaşık 20 dakika sürer.

Söz veriyorum, çocuklarınız birkaç yüz oyunu bitirmeden çok önce asmaktan sıkılacaklar ...: D


3
Öyle olmak zorunda değildir o karmaşık. Örneğin, Blender'ın yorumuna bir göz atın. Cevabınız gerçekten temel soruyu ele almıyor ve özellikle kullanışlı değil.
Tikhon Jelvis

4
"Neden sadece üç dizi oluşturmuyorsunuz (kolay, orta ve zor) ve her birine yüz ya da daha fazla kelime eklemiyorsunuz?": "Sorunun çözüldüğünü varsayarak çözme" yöntemi de denir.
Pascal Cuoq

Eleştiri alındı, teşekkür ederim ... Sanırım akademik açıdan kesinlikle haklısın, cevabım hiçbir şeyi çözmüyor. Ama pratik bir bakış açısından, yani çocuklarınız için bir adam asmaca oyunu geliştirmenin en kolay yolu, cevabım bunu ucuza ve hızlı bir şekilde çözüyor.
BBagi

1
@PascalCuoq Veya bunun "insanların algoritmalardan daha uygun listeleri seçmede daha iyi olduğunu varsayarak sorunu çözme" yaklaşımı olduğunu söyleyebilirsiniz. Soru soran kişinin çocuklar için bir oyun istediği göz önüne alındığında, daha az tahminle bulunsalar bile "şapka, kedi, güneş" kolay listede ve "ksilofon, boşuna, okul" zor listede olması daha iyi görünüyor. ortalamada.
Darren Cook

1
@PascalCuoq Karmaşık bir sorunu atlatmanın yanlış bir tarafı yok, ancak ondan kurtulabilirseniz basit bir çözüm. Eğlenmek için karmaşık algoritmalar oluşturmakta da yanlış bir şey yok, ancak basit çözüm en azından bahsetmeyi hak ediyor.
David

1

Pekala, potansiyel olarak ilgili birçok şey olabilir:

  1. Herkesin dediği gibi, tek tek harflerin sıklığı;
  2. Bir kelimenin uzunluğu kesinlikle sayılmalıdır, ancak doğrusal bir şekilde değil - uzun bir kelime rastgele tahminlerin harflere denk gelmesine neden olabilirken, kısa bir kelimeyi elde etmek zor olabilir;
  3. Ayrıca, kelimelerin kendileri de dikkate alınmalıdır - "bipartite", SO'daki insanlar için bir kelime olabilir, ancak teknik olmayan nüfus için olmayabilir.

Aslında, birkaç stratejiyi birlikte geliştirmeyi deneyebilirsiniz ; bunların yarısı bir kelimenin değerine karar vermek için ve bunların yarısı oyunu kazanmaya çalışmak için. İkinci grup, puanı en üst düzeye çıkarmaya çalışırken, ilki puanı en aza indirmeye çalışır. Bir süre sonra bir kalıp olabilir ve sonra bir kelimenin değerine karar vermenin yarısı size bazı ölçütler verebilir.


Bir kelimenin kullanım sıklığı iyi bir noktadır. Eşsiz harfleri sıklığa göre puanlamaya dayanan ilk denemem "ötektik" olduğunu iddia etti "kolay" bir kelimeydi. Google ngrams storage.googleapis.com/books/ngrams/books/datasetsv2.html , bugün yaygın olarak kullanılan kelimeleri belirlemeye yardımcı olabilir gibi görünüyor.
grrussel

1

Bir kelime listesiyle başlayın ve her biri için bir google araması başlatın. İsabet Sayısı terimin zorluğunun (kaba) bir Vekili olarak hizmet etsin.

Geliştirilmiş bir versiyonda, kelimeleri Eşanlamlı Sözlüğe Dayalı İlişkiye göre gruplandırır ve google aramalarının Sonuçlarını sayarak bir kategorinin en zor kelimesini belirlersiniz.

N-Gram Kavramı Bir adım daha ileri götürürsek, bir Sözcüğün zorluğu nesirdeki hecelerinin sıklığı ile derecelendirilebilir. Elbette hece istatistiklerinin kalitesine bağlı. Muhtemelen Sözcük ve İşlev sözcükleri (belirleyiciler, bağlaçlar vb.) Arasında Ayırım yapmanız ve Sözcükteki hecelerin sayısına göre Normalize etmeniz (Yazarken Aşırı Öldürmek Gibi Hissediyor ...) gerekir.


0

Kullanıcılara göre öğrenen ve değişen bir algoritma oluşturma fikrini seviyorum. Başlangıçta, listeyi ortaya çıkarmak için önerilen algoritmalardan herhangi birini uygulayabilir, ardından oyunu daha fazla kişi oynadıkça, tahmin sayısına bağlı olarak kelimelerin her birine bir ağırlık atarsınız (ki bu da sürekli olarak izlenir ve hesaplanır) ). Bu, karmaşık ancak popüler kelimelerin zor derecelendirilmesini önler, ancak insanlar tarafından iyi bilinir.


0

Scrabble noktalarında bir kelimenin her harfinin değerini hesaplayın: E = 1, D = 2, V = 4, X = 8 vb. Ortalama bir harf değeri elde etmek için bunları toplayın ve harf sayısına bölün ve kelimeyi puanlamak için bunu kullanın. Büyük bir sözlükteki her kelimenin ortalamasını hesaplayın ve çeyrekler arasındaki kesme noktalarını belirleyin. En alt çeyrekteki kelimeleri "kolay", ortadaki iki çeyrekteki kelimeleri "orta" ve en yüksek çeyrekteki kelimeleri "zor" olarak adlandırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.