Thuật toán phân loại các từ cho mức độ khó của người treo cổ là “Dễ”, “Trung bình” hoặc “Khó”


114

Một thuật toán tốt để xác định "độ khó" của một từ cho trò chơi treo cổ là gì, để trò chơi có thể chọn các từ phù hợp với một độ khó đã chỉ định?

Khó khăn dường như liên quan đến số lần đoán được yêu cầu, tần suất sử dụng các chữ cái tương đối (ví dụ: các từ có nhiều chữ cái không phổ biến có thể khó đoán hơn) và có thể là độ dài của từ.

Cũng có một số yếu tố chủ quan cần (cố gắng) bù đắp, chẳng hạn như khả năng một từ có trong từ vựng của người chơi và có thể được nhận ra, cho phép chuyển từ chiến lược đoán chỉ dựa trên tần số chữ cái sang đoán dựa trên danh sách các từ nối đã biết.

Nỗ lực của tôi bây giờ là dưới đây bằng ruby. Bất kỳ đề xuất nào về cách cải thiện việc phân loại?

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

Tôi đang viết một trò chơi treo cổ tôi muốn các con tôi chơi; Tôi đã quá già để cố gắng làm "bài tập về nhà", đó có thể là lý do tại sao câu hỏi nhận được rất nhiều phiếu bầu ... Các từ được lấy ngẫu nhiên từ cơ sở dữ liệu từ lớn, bao gồm nhiều từ khó hiểu và đang được lọc theo mức độ khó xác định cho từ.


12
Tại sao lại phản đối? Đây là một câu hỏi khá. Tôi sẽ thực hiện một hàm khó khăn như thế nào f(w) = (# unique letters) * (7 - # vowels) * (sum of the positions of unique letters in a list, ordered by frequency). Từ đó, bạn có thể chia phạm vi của chức năng thành ba phân đoạn và gọi đó là những khó khăn của bạn.
Máy xay sinh tố

2
Tôi khuyên bạn nên thực hiện tìm kiếm trên web cho điều này - có thể có các thuật toán hoặc từ điển nhằm tính toán / báo cáo độ phức tạp của từ. Tôi biết có cho văn bản dài hơn.
Hot Licks

3
Liên quan: youtube.com/watch?v=bBLm9P-ph6U (QI XL - Lời Hardest để Đoán trong Hangman)
Claus Jørgensen

5
Dù bạn làm gì, hãy đảm bảo bao gồm EXTINCTIONSPECTROPHOTOPOLERISCOPEOCCULOGRAVOGYROKYNETOMETER.
Hot Licks

2
Đối với những người dùng có thể không quen thuộc với Ruby, có thể bạn muốn giải thích dòng đầu tiên của phương thức của bạn làm gì? n = w.chars.to_a.uniq.lengthNó có đếm số lượng chữ cái duy nhất không?
T Nguyen

Câu trả lời:


91

1. Giới thiệu

Đây là một cách để tiếp cận vấn đề này một cách có hệ thống: nếu bạn có một thuật toán chơi tốt trò treo cổ, thì bạn có thể lấy độ khó của mỗi từ là số lần đoán sai mà chương trình của bạn sẽ thực hiện nếu đoán từ đó.

2. Bên cạnh chiến lược treo cổ

Có một ý tưởng tiềm ẩn trong một số câu trả lời và nhận xét khác, rằng chiến lược tối ưu cho người giải sẽ là dựa trên quyết định của họ về tần suất của các chữ cái trong tiếng Anh hoặc tần suất của các từ trong một số ngữ liệu. Đây là một ý tưởng quyến rũ, nhưng nó không hoàn toàn đúng. Bộ giải sẽ hoạt động tốt nhất nếu nó lập mô hình chính xác sự phân bố của các từ do người sắp xếp chọn và người sắp xếp là con người có thể đang chọn các từ dựa trên độ hiếm của chúng hoặc tránh các chữ cái thường dùng. Ví dụ, mặc dù Elà ký tự thường xuyên nhất được sử dụng bằng tiếng Anh, nếu setter luôn ưu tiên chọn từ các từ JUGFUL, RHYTHM, SYZYGY, và ZYTHUM, sau đó một người giải quyết hoàn hảo không bắt đầu bằng cách đoán E!

Cách tiếp cận tốt nhất để lập mô hình setter phụ thuộc vào ngữ cảnh, nhưng tôi đoán rằng một số loại suy luận quy nạp Bayes sẽ hoạt động tốt trong bối cảnh mà người giải quyết chơi nhiều trò chơi với cùng một setter hoặc chống lại một nhóm các setter tương tự.

3. Một thuật toán treo cổ

Ở đây tôi sẽ phác thảo một bộ giải khá tốt (nhưng không hoàn hảo). Nó mô hình hóa bộ định nghĩa như việc chọn từ đồng nhất từ ​​một từ điển cố định. Đó là một thuật toán tham lam : ở mỗi giai đoạn, nó đoán chữ cái để giảm thiểu số lần bỏ lỡ, tức là những từ không chứa câu đoán. Ví dụ, nếu không có phỏng đoán nào được đưa ra cho đến nay và các từ có thể là DEED, DEADDARE, thì:

  • nếu bạn đoán Dhoặc E, không có bỏ lỡ;
  • nếu bạn đoán A, có một lần bỏ lỡ ( DEED);
  • nếu bạn đoán R, có hai lần bỏ lỡ ( DEEDDEAD);
  • nếu bạn đoán bất kỳ chữ cái nào khác, có ba lần bỏ lỡ.

Vì vậy, một trong hai Dhoặc Elà một dự đoán tốt trong tình huống này.

(Cảm ơn Đại tá Panic trong các bình luận vì đã chỉ ra rằng các phỏng đoán đúng là miễn phí trong treo cổ — tôi hoàn toàn quên điều này trong lần thử đầu tiên của mình!)

4. Thực hiện

Đây là cách triển khai thuật toán này bằng 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. Kết quả ví dụ

Sử dụng chiến lược này, bạn có thể đánh giá độ khó đoán từng từ trong bộ sưu tập. Ở đây tôi xem xét các từ gồm sáu chữ cái trong từ điển hệ thống của mình:

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

Các từ dễ đoán nhất trong từ điển này (cùng với chuỗi các phép đoán cần thiết để người giải đoán chúng) như sau:

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

và những từ khó nhất là:

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

Lý do mà những điều này khó là vì sau khi bạn đã đoán -UZZLE, bạn vẫn còn bảy khả năng:

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

6. Lựa chọn danh sách từ

Tất nhiên khi chuẩn bị danh sách từ cho con bạn, bạn sẽ không bắt đầu với từ điển hệ thống của máy tính, bạn sẽ bắt đầu với danh sách các từ mà bạn nghĩ chúng có thể biết. Ví dụ, bạn có thể xem danh sách các từ được sử dụng thường xuyên nhất của Wiktionary trong các kho ngữ liệu tiếng Anh khác nhau.

Ví dụ, trong số 1.700 từ gồm 6 chữ cái trong 10.000 từ phổ biến nhất trong Project Gutenberg tính đến năm 2006 , thì 10 từ khó nhất là:

[(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 là một nhân vật trong Forsyte Saga của John Galsworthy ; danh sách từ đã được chuyển đổi thành chữ thường nên tôi không thể nhanh chóng xóa tên riêng.)


1
Gọi tốt trong danh sách từ được sử dụng thường xuyên. invokeit.wordpress.com/frequency-word-lists có tiếng Anh và tiếng Thụy Điển, rất vui khi có cả hai.
grrussel

1
Tôi mong chờ bingleđược đánh giá khó hơn singlehoặc tingle- binglelà một từ ít phổ biến b là một lá thư ít phổ biến
BlueRaja - Danny Pflughoeft

5
Thuật toán tuyệt vời (và cảm ơn bạn đã giải thích bằng tiếng Anh trước khi viết mã!). Nhưng tôi nghĩ bạn nên cố gắng giảm thiểu số lần đoán sai . Vì vậy, nếu từ điển là [bat, bet, hat, hot, yum], tôi sẽ đoán là 'T' (chứ không phải B, A hoặc H). Nếu tôi đúng, tôi không mất gì cả. Nếu tôi sai, thì chỉ còn lại 'yum'.
Colonel Panic

8
Đây là một thuật toán thực sự thú vị, nhưng tôi nghĩ không phản ánh chiến lược mà người chơi có thể làm - thay vì biết từng từ đơn lẻ, con người sẽ nhận ra (theo xác suất) những từ phổ biến nhất, và nếu không sẽ cố gắng nhận ra đủ và tiền tố (như ion, ing) và không chỉ đoán các chữ cái phổ biến (bắt đầu bằng nguyên âm, sau đó thực hiện t / r / s / n / etc). Bạn không chắc chắn làm thế nào để mã này, nhưng đó là một cái gì đó để suy nghĩ về :)
Patashu

2
Phân tích tuyệt vời. Như @Patashu đã chỉ ra, bước tiếp theo để làm cho điều này thậm chí còn tốt hơn là thay vì chỉ lấy một từ điển các từ thông dụng, hãy lấy một từ điển đầy đủ các từ nhưng có chú thích về tính phổ biến và chỉ đơn giản là cân nhắc về tính phổ biến của từ với sự khó khăn-phân phối thư. Nhưng đó chỉ là cải tiến tùy chọn - đây đã là một giải pháp tuyệt vời như hiện tại.
Ben Lee,

21

Một cách thực sự đơn giản là tính điểm dựa trên việc thiếu các nguyên âm trong từ, số lượng các chữ cái duy nhất và mức độ phổ biến của mỗi chữ cái:

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

Và đầu ra:

432 the
3360 potato
7200 school
7800 egypt
194271 floccinaucinihilipilification

Sau đó, bạn có thể ghi điểm các từ bằng:

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

Chào máy xay sinh tố, bạn có thể cho mình biết con số 7 thần kỳ có tác dụng gì? Tại sao không phải là 6 hoặc 50? Điều gì sẽ xảy ra nếu tôi nhập một số arbritary khác?
Pavan

@Pavan: Không có gì thực sự. Điểm của tất cả các từ sẽ được tăng lên cùng một lượng.
Máy xay sinh tố

vâng, tôi nhận thấy sự thay đổi khi tôi chơi với một người thực thi python trực tuyến. Tôi nhận thấy điều gì đó và đó là khi tôi nhập một thứ gì đó giống như tưởng tượng so với ghê tởm, gớm ghiếc sẽ có giá trị thấp hơn so với tưởng tượng mặc dù tưởng tượng là một từ được viết đúng chính tả hơn, do đó sẽ xuất hiện ở mức độ khó thấp hơn trong trò chơi chữ. Điều này khiến tôi nhận ra rằng khó khăn là chủ quan nhưng tôi nghĩ rằng nên có một số loại nghiên cứu được thực hiện để phác thảo những từ khó đánh vần nhất so với những từ khác, phải không? Xin bạn chỉ cho tôi một nghiên cứu như vậy?
Pavan

Hoặc ít nhất một nghiên cứu như vậy sẽ được gọi là gì vì tôi đang gặp khó khăn trong việc tìm kiếm một bộ sưu tập các từ với tỷ lệ người đánh vần từ đó sai trong lần thử đầu tiên - đó là điều mà tôi đang theo đuổi.
Pavan

9

Bạn có thể sử dụng Phương pháp Monte Carlo để ước tính độ khó của một từ:

  • Mô phỏng một trò chơi bằng cách đoán một chữ cái ngẫu nhiên mỗi lần, được tính theo tần suất của chữ cái trong ngôn ngữ mục tiêu của bạn và đếm xem người chơi ngẫu nhiên của bạn có bao nhiêu lần đoán để tìm ra giải pháp. Lưu ý rằng vì mỗi lần đoán loại bỏ một chữ cái, quá trình này là hữu hạn và nó trả về một số từ 1 đến 26, bao gồm cả.
  • Lặp lại quá trình này 2*Nnhiều lần, Nsố lượng các chữ cái duy nhất trong từ của bạn là bao nhiêu,
  • Tính điểm bằng cách lấy trung bình kết quả của các 2*Nlần chạy,
  • Xác định mức độ phức tạp: điểm dưới mười cho biết một từ dễ, và điểm trên mười sáu cho biết một từ khó; mọi thứ khác ở mức trung bình.

2
Tôi nghĩ bạn chỉ nên tính những phỏng đoán không chính xác . Không có hình phạt cho những dự đoán đúng.
Colonel Panic

Tại sao số lần lặp lại như vậy? Tôi nghĩ rằng chiến lược này (giống như hầu hết các chiến lược ngẫu nhiên) có phương sai lớn hơn cho các từ ngắn hơn .
Đại tá Panic

@ColonelPanic Tôi nghĩ rằng việc đếm tổng số lần đoán sẽ tốt hơn, vì nó kết hợp số lượng các chữ cái khác nhau vào câu trả lời một cách tự nhiên. Bạn có thể đúng về sự khác biệt khi các từ ngắn hơn cao hơn. Có lẽ số lần lặp lại nên được cố định sau đó. Tuy nhiên, tôi nghĩ 2N sẽ là một khởi đầu ổn.
dasblinkenlight

4

Thảo luận tương tự trước đó về chủ đề tương tự: Xác định độ khó của một từ tiếng Anh

Tôi thích câu trả lời ở cuối liên kết ^. Đối với trò chơi treo cổ dành cho trẻ em, chỉ cần áp dụng một cách tiếp cận như trò scrabble.

Gán một giá trị điểm cho mỗi chữ cái, sau đó chỉ cần cộng các chữ cái lại.


1
Điều này, cùng với việc tránh những từ hiếm hoặc khó hiểu ở các cấp độ dễ, có vẻ như là cách để tiến tới bây giờ. Một biến chứng tôi đã không được đề cập là những từ được lựa chọn từ những từ điển khổng lồ, phần lớn trong số đó phải theo định nghĩa được chữ ít được sử dụng :-)
grrussel

Giá trị điểm có thể hoạt động, có khả năng sử dụng tần suất chữ cái . Mặc dù, một số từ thường được sử dụng thực sự có thể có giá trị điểm cao kỳ lạ.
Nuclearman,

3

Một thời gian trước, tôi đã viết một công cụ giải bài treo cổ bằng cách sử dụng thuật toán hiển nhiên: đưa ra một từ điển ban đầu của tất cả các từ có thể, ở mỗi lượt, chúng tôi chọn chữ cái xuất hiện trong nhiều từ nhất còn lại trong từ điển, sau đó loại bỏ các từ không phù hợp (tùy thuộc vào phản hồi) từ từ điển.

Thuật toán không hoàn toàn đơn giản như thế này, vì thường có một số chữ cái xuất hiện với cùng một số từ trong từ điển. Trong trường hợp này, việc lựa chọn chữ cái có thể tạo ra sự khác biệt đáng kể về số lượng đoán được yêu cầu cho một từ. Chúng tôi chọn cực đại trong đó thông tin kết quả về vị trí của chữ cái đó (nếu thực sự có trong từ) cung cấp thông tin tối đa về hệ thống (chữ cái có entropy thông tin tối đa ). ví dụ: nếu hai từ có thể còn lại là 'bách khoa toàn thư' và 'bách khoa toàn thư', thì chữ cái 'c' có cùng xác suất xuất hiện như e, n, y, l, o, p, e, d, i (nghĩa là được đảm bảo trong từ), nhưng chúng ta nên hỏi về 'c' trước vì nó có entropy thông tin khác không.

Nguồn (C ++, GPL) ở đây

Kết quả của tất cả những điều này là một danh sách các từ, với số lần đoán được yêu cầu cho mỗi từ: khó khăn.txt (630KB). Từ khó tìm nhất cho thuật toán này là "will" (với 14 lần đoán không thành công); chữ i và l gấp đôi được đoán khá nhanh, nhưng sau đó các tùy chọn bao gồm hóa đơn, thì là, điền, mang, đồi, giết, cối xay, viên thuốc, rill, đến, sẽ, và từ đó tùy chọn duy nhất là đoán từng chữ cái trong xoay. Nói cách khác, các từ dài hơn được đoán nhanh hơn nhiều (chỉ có điều không phải là có thể để lựa chọn).

Tất nhiên, trong trò chơi treo cổ của con người, tâm lý học (và phạm vi từ vựng) đóng một vai trò lớn hơn nhiều so với thuật toán này.


3

Cứ làm đi! Chơi trò treo cổ với từ. Đếm xem cần đánh bại bao nhiêu lần bị mất (tức là đoán không chính xác).

Bạn sẽ cần một chiến lược để chơi. Đây là chiến lược con người (ish). Từ từ điển, loại bỏ tất cả các từ không phù hợp với các tiết lộ cho đến nay. Đoán chữ cái thường xuyên nhất trong số các từ còn lại.

Nếu chiến lược của bạn là ngẫu nhiên, bạn có thể xác định số đo của mình là số lần bị mất dự kiến ​​và ước tính số đó theo kinh nghiệm.


Một chiến lược xác định khác, từ một bot treo cổ mà tôi đã viết cách đây vài năm. Đoán chữ cái mà tối thiểu số từ còn lại trong trường hợp đoán không chính xác (tức là tối ưu hóa trường hợp xấu nhất). Hôm nay tôi không thích chiến lược này vì quá máy móc, tôi thích chiến lược ở trên hơn.


Haha, tôi cũng định đề xuất điều tương tự. Nhưng một phiên bản nghiêm túc: viết một bot đơn giản có thể đoán bằng một số chiến lược đơn giản, sau đó chỉ cần chạy nó nhiều lần qua các từ trong từ điển.
Tikhon Jelvis

Vâng, đó là những gì tôi muốn nói!
Đại tá Panic

2

Tất nhiên, trước tiên, bạn sẽ tạo một danh sách các chữ cái duy nhất. Sau đó, sắp xếp theo tần suất (bằng tiếng Anh hoặc bất kỳ ngôn ngữ nào - có danh sách cho việc này ), với các chữ cái ít thường xuyên hơn có độ khó cao hơn.

Sau đó, bạn cần quyết định xem bạn kết hợp các điểm số bằng cách cộng, nhân hoặc sử dụng một số lược đồ khác.


(Trên thực tế, bạn có thể không cần sắp xếp theo tần suất mà chỉ cần tích lũy điểm tần suất. Mặc dù việc phân loại có thể cung cấp thêm một số thông tin - đáng để thử xem nó có làm được điều gì đó cho bạn hay không.)
Hot Licks

Và bạn có thể muốn giải thích bằng cách nào đó cho các tổ hợp chữ cái - tức là, nếu có Q thì gần như chắc chắn có chữ U, và chữ U thì khả năng xảy ra chữ Q cao hơn nhiều. Vì vậy, nó có thể có ý nghĩa, ví dụ, coi QU là một chữ cái đơn lẻ, từ một tần số POV.
Hot Licks

1

Bạn đang bị phản đối vì bạn đang yêu cầu chúng tôi xây dựng một thuật toán rất phức tạp cho bạn.

Tại sao bạn không chỉ tạo ba mảng (dễ, trung bình và khó) và điền vào mỗi mảng một trăm hoặc lâu hơn? Nó sẽ mất khoảng 20 phút.

Tôi hứa bọn trẻ của bạn sẽ chán trò chơi treo cổ từ lâu trước khi chúng cháy hết vài trăm trò chơi ...: D


3
Nó không phải phức tạp. Ví dụ: hãy xem bình luận của Blender chẳng hạn. Câu trả lời của bạn không thực sự giải quyết được câu hỏi cốt lõi và không đặc biệt hữu ích.
Tikhon Jelvis

4
“Tại sao bạn không chỉ tạo ba mảng (dễ, trung bình và khó) và điền vào mỗi mảng một trăm hoặc lâu hơn?”: Còn được gọi là phương pháp “giải quyết vấn đề bằng cách giả định vấn đề đã được giải quyết”.
Pascal Cuoq

Phê bình, cảm ơn ... Tôi đoán ở góc độ học thuật, bạn hoàn toàn đúng, câu trả lời của tôi chẳng giải quyết được gì. Nhưng từ quan điểm thực tế, đó là cách dễ nhất để xây dựng trò chơi treo cổ cho con bạn, câu trả lời của tôi giải quyết được nó, rẻ và nhanh chóng.
BBagi

1
@PascalCuoq Hoặc bạn có thể nói đây là cách tiếp cận để "giải quyết vấn đề bằng cách giả định rằng con người giỏi hơn trong việc chọn danh sách phù hợp hơn là thuật toán". Vì người hỏi muốn một trò chơi dành cho trẻ em, nên có vẻ tốt hơn là "hat, cat, sun" nằm trong danh sách dễ và "xylophone, naught, school" nằm trong danh sách khó, ngay cả khi chúng có thể được tìm thấy với ít lần đoán hơn Trung bình.
Darren Cook

1
@PascalCuoq Không có gì sai khi bỏ qua một vấn đề phức tạp, mặc dù một giải pháp đơn giản nếu bạn có thể giải quyết nó. Không có gì sai khi xây dựng các thuật toán phức tạp để giải trí, nhưng giải pháp đơn giản ít nhất cũng đáng được đề cập.
David

1

Chà, có thể có rất nhiều thứ liên quan:

  1. Như mọi người đã nói, tần suất xuất hiện của các chữ cái riêng lẻ;
  2. Độ dài của một từ chắc chắn nên được tính, nhưng không phải theo cách tuyến tính - một từ dài có thể làm cho các chữ cái đoán ngẫu nhiên, trong khi một từ ngắn có thể khó nhận được;
  3. Ngoài ra, bản thân các từ cũng nên được xem xét - "lưỡng cực" có thể là một từ dành cho những người trên SO, nhưng có thể không dành cho những người không chuyên về kỹ thuật.

Trên thực tế, bạn có thể cố gắng cùng phát triển một số chiến lược , một nửa trong số chúng để quyết định giá trị của một lời nói, và một nửa trong số chúng để cố gắng giành chiến thắng trong trò chơi. Nhóm sau sẽ cố gắng tối đa hóa số điểm trong khi nhóm đầu tiên cố gắng giảm thiểu số điểm. Sau một thời gian, có thể có một khuôn mẫu và sau đó một nửa quyết định giá trị của một từ có thể cung cấp cho bạn một số điểm chuẩn.


Tần suất sử dụng của một từ là một điểm tốt. Nỗ lực đầu tiên của tôi dựa trên việc tính điểm các chữ cái duy nhất theo tần suất đã khẳng định "eutectic" là một từ "dễ dàng". Google ngrams storage.googleapis.com/books/ngrams/books/datasetsv2.html dường như có thể giúp xác định các từ được sử dụng phổ biến ngày nay.
grrussel

1

Bắt đầu với Danh sách các từ và Khởi chạy tìm kiếm trên google cho từng Từ. Hãy để Số lần truy cập đóng vai trò như một Proxy (thô) về độ khó của thuật ngữ.

Trong một phiên bản tinh chỉnh, bạn sẽ nhóm các từ theo một từ đồng nghĩa Quan hệ Dựa trên Từ đồng nghĩa và xác định từ khó nhất của một danh mục bằng cách đếm Kết quả tìm kiếm trên google.

Đưa ra khái niệm về n-Gram Thêm một bước nữa, độ khó của một Từ có thể được đánh giá bằng tần suất các âm tiết của nó trong văn xuôi. Tất nhiên phụ thuộc vào chất lượng của số liệu thống kê âm tiết. Bạn có thể sẽ phải Phân biệt giữa các từ Lexemes và Hàm (bộ xác định, liên từ, v.v.) và Bình thường hóa theo số lượng âm tiết trong Từ (Cảm giác như Quá mức cần thiết khi tôi Viết ...).


0

Tôi thích ý tưởng xây dựng một thuật toán có thể học và thay đổi tùy thuộc vào người dùng. Khi bắt đầu, bạn có thể triển khai bất kỳ thuật toán nào được đề xuất để đưa ra danh sách, sau đó khi có nhiều người chơi trò chơi hơn, bạn chỉ định trọng số cho mỗi từ tùy thuộc vào số lần đoán (điều này cũng liên tục được theo dõi và tính toán ). Điều này ngăn chặn vấn đề các từ phức tạp nhưng phổ biến được xếp hạng khó nhưng được mọi người biết đến.


0

Tính giá trị của mỗi chữ cái của một từ trong các điểm Scrabble: E = 1, D = 2, V = 4, X = 8, v.v. Cộng chúng lại và chia cho số chữ cái để có giá trị chữ cái trung bình, và dùng giá trị đó để tính điểm cho từ. Tính giá trị trung bình cho mỗi từ trong một từ điển lớn và xác định điểm ngắt giữa các phần tư. Gọi các từ trong phần tư thấp nhất là "dễ dàng", các từ trong hai phần tư ở giữa là "trung bình" và các từ trong phần tư cao nhất là "khó".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.