Mencari Kata Pertama Wordle Terbaik menggunakan Python (Bagian 1)

Fahmi Salman
Miloo Community
Published in
3 min readAug 1, 2022
Photo by Nils Huenerfuerst on Unsplash

Ketika kita berbicara Wordle, sudah pasti yang kita permata kali pertimbangkan adalah pemilihan kata pertama, mengapa? karena kata itulah yang nantinya akan menentukan ke arah mana permainan akan berjalan. Semakin efektif kata pertama-nya, semakin banyak petunjuk yang bisa kita dapat untuk mendapatkan huruf yang tepat.

Dalam postingan kali ini, saya akan mencari solusi untuk mendapatkan kata pertama terbaik dengan menggunakan python. Disini saya hanya akan menggunakan metode statistik dasar agar mudah dipahami semua orang.

Saya menggunakan dataset dari The Art of Computer Programming (TAOCP) by Donald E. Knuth. Dataset tersebut berisi kata-kata dalam bahasa inggris yang terdiri 5 huruf (sesuai dengan batas huruf pada wordle) dengan jumlah kata sebanyak 5757 kata.

Hal pertama yang saya lakukan adalah dengan mengimport dependencies dan load file dataset.

import pandas as pd
import numpy as np
import math
words = []
with open('sgb-words.txt') as f:
words = [line.rstrip() for line in f]

Dataset tersebut berisi data sebagai berikut.

which
there
their
about
would
...
pupal

Pemrosesan pertama yang dilakukan adalah dengan menghilangkan huruf-huruf yang sama pada setiap kata. Hal ini diperlukan agar kita bisa mendapatkan kata dengan 5 huruf yang berbeda. Caranya adalah sebagai berikut.

distinct_words = []
for word in words:
distinct_words.append(list(set(word)))

Hasilnya akan menjadi seperti ini.

[['w', 'h', 'i', 'c'],
['t', 'h', 'e', 'r'],
['t', 'h', 'e', 'i', 'r'],
['a', 'b', 'o', 'u', 't'],
['w', 'o', 'u', 'l', 'd'],
...
['p', 'u', 'a', 'l']]

Setelah itu, kita bisa mendapatkan bobot dari masing-masing huruf. Caranya cukup sederhana, yaitu dengan menjumlahkan setiap huruf-huruf, dan hasilnya disajikan dalam bentuk dictionary. Bobot tersebut akan menentukan seberapa sering huruf tersebut muncul, semakin sering huruf tersebut muncul, semakin besar pula bobot dari huruf tersebut.

letter_counter = {}
for word in distinct_words:
for letter in word:
if letter in letter_counter:
letter_counter[letter] += 1
else:
letter_counter[letter] = 0

Hasilnya adalah sebagai berikut.

{'h': 790,
'w': 500,
'i': 1538,
'c': 919,
'e': 2657,
't': 1461,
'r': 1798,
'u': 1067,
'a': 2180,
'o': 1682,
'b': 668,
'l': 1433,
'd': 1099,
's': 2673,
'f': 501,
'g': 650,
'k': 573,
'n': 1218,
'y': 867,
'p': 894,
'v': 308,
'm': 793,
'q': 52,
'j': 87,
'x': 137,
'z': 120}

Jika kita urutkan, hasilnya akan menjadi seperti ini.

>>> {key: val for key, val in sorted(letter_counter.items(), key = lambda x: x[1], reverse = True)}{'s': 2673,
'e': 2657,
'a': 2180,
'r': 1798,
'o': 1682,
'i': 1538,
't': 1461,
'l': 1433,
'n': 1218,
'd': 1099,
'u': 1067,
'c': 919,
'p': 894,
'y': 867,
'm': 793,
'h': 790,
'b': 668,
'g': 650,
'k': 573,
'f': 501,
'w': 500,
'v': 308,
'x': 137,
'z': 120,
'j': 87,
'q': 52}

Dari hasil tersebut, bisa terlihat bahwa 5 huruf yang paling sering muncul adalah huruf s, e, a, r, dan o.

Sebagai tambahan, ini merupakan hasil jika dijadikan dalam persentasi.

>>> values = letter_counter.values()
>>> total = sum(values)
>>> percent = [value * 100. / total for value in values]
>>> for i, letter in enumerate(letter_counter.keys()):
... print("{}: {}".format(letter, percent[i]))
h: 2.962685167822989
w: 1.8751171948246765
i: 5.767860491280705
c: 3.4464654040877556
e: 9.964372773298331
t: 5.479092443277705
r: 6.742921432589537
u: 4.00150009375586
a: 8.17551096943559
o: 6.307894243390212
b: 2.505156572285768
l: 5.374085880367523
d: 4.121507594224639
s: 10.024376523532721
f: 1.878867429214326
g: 2.4376523532720795
k: 2.148884305269079
n: 4.567785486592912
y: 3.2514532158259892
p: 3.3527095443465216
v: 1.1550721920120008
m: 2.973935870991937
q: 0.19501218826176636
j: 0.3262703918994937
x: 0.5137821113819614
z: 0.45002812675792236

Selanjutnya, kita hanya perlu mencari kata yang mempunyai huruf dengan bobot teratas. Caranya adalah sebagai berikut.

word_values = []
for word in distinct_words:
temp_value = 0
for letter in word:
temp_value += letter_counter[letter]
word_values.append(temp_value)
words[np.argmax(word_values)]

Dan hasilnya adalah arose. Jika dilihat dari data diatas, bisa dilihat bahwa kata arose memiliki huruf-huruf yang mempunyai bobot yang tinggi. Jadi bisa disimpulkan kata arose merupakan kata terbaik untuk digunakan pada kata pertama wordle berdasarkan hasil statistik.

Namun apakah kata pertama saja cukup? Di postingan selanjutnya saya akan menjelaskan cara mendapatkan kata kedua dan seterusnya serta bagaimana cara membuat prediksi yang dinamis.

--

--