<p>我试图做一个程序,猜测用户所想的词,但现在的程序只是基于消除。有没有人对如何让它变得更好有想法?你知道吗</p>
<p>下面简要介绍一下它现在的工作原理:</p>
<p>我有一个单词列表存储在“palavras.txt文件,则这些单词将被转换为常规列表。你知道吗</p>
<p>第一个问题是:“你的单词有多少个字母?”。在此基础上,该程序继续消除所有其他单词谁没有同样数量的字母。之后,它创建一个列表,其中包含按字母在给定位置出现的次数组织的所有字母。你知道吗</p>
<p>然后我们有第二个问题:“x”是你单词的第一个字母吗。如果回答为“not”,则删除该位置包含该字母的所有单词,然后转到该位置最常用的第二个字母,依此类推。如果是的话,它会删除所有在特定位置不包含该字母的单词,并转到该单词的下一个字母。以此类推,直到单词写完。你知道吗</p>
<p>它一直有效,但有时需要相当多的时间。有更好的方法吗?人工智能?也许是机器学习?你知道吗</p>
<p>代码并不重要,因为我只是在寻找想法,但如果有人好奇,我是如何做到的:</p>
<pre><code>import os
from unicodedata import normalize
import random
import string
# Define a função que retira os acentos das palavras
def remover_pont(txt):
import string
return txt.translate(str.maketrans('', '', string.punctuation))
def remover_acentos(txt):
return normalize('NFKD', txt).encode('ASCII', 'ignore').decode('ASCII')
# Retorna uma lista com as letras mais usadas naquela posição, em ordem
def letramusada(lista, pletra):
pletraordem = []
pletraordem2 = []
pl = []
for n in lista:
try:
pl.append(n[pletra - 1])
except:
pass
dict = {}
for k in pl:
if k in dict:
dict[k] += 1
else:
dict[k] = 1
pletraordem2 = (sorted(dict.items(), key=lambda t: t[1], reverse=True))
for c in pletraordem2:
pletraordem.append(c[0])
return pletraordem
# Lê o "banco de dados" que contém as palavras e as armazena na variável "palavras", sem acentos
file = open('palavras.txt')
palavras = file.read().split("\n")
# Armazena a quantidade de letras que a palavra pensada tem
nletras = int(input('Digite o número de letras da palavra (considerando hífen, caso haja) que você pensou, com máximo de 8: '))
# Declara listas que serão usadas em seguida
npalavras = []
palavras2 = []
palavras3 = []
# Armazena todas as palavras que contém a quantidade de letras escolhida anteriormente em uma nova lista chamada "nletras", desconsiderando pontos
for n in palavras:
if nletras == len(n):
npalavras.append(remover_acentos(n).lower())
c = 0
n = 0
for k in range(1, nletras + 1):
ordem = letramusada(npalavras, k)
cond = 0
try:
while cond == 0:
if len(npalavras) < 20 and c == 0:
print("\nHmmm, estou chegando perto!\n")
c += 1
if len(npalavras) < 3:
break
for c in ordem:
if c != 0:
r = str(input("A {} letra da sua palavra é a letra \"{}\"? [S/N] ".format(k, c))).lower()
r = r[0]
if r == "s":
for n in npalavras:
if n[k-1] == c:
palavras2.append(n)
npalavras.clear()
npalavras = palavras2[:]
palavras2.clear()
ordem.clear()
cond += 1
break
else:
for n in npalavras:
if n[k-1] != c:
palavras2.append(n)
npalavras.clear()
npalavras = palavras2[:]
palavras2.clear()
r = 0
pass
except:
n = 1
print("\nDesculpe, não achei nenhuma palavra :(")
escolha = random.choice(npalavras)
if n != 0:
print("\nA palavra que você pensou é: \"{}\"".format(escolha))
</code></pre>
<p>还有一篇文章提到了单词暗示算法,甚至还有python代码。
这是链接<a href="https://stackoverflow.com/questions/2294915/what-algorithm-gives-suggestions-in-a-spell-checker?noredirect=1&lq=1">What algorithm gives suggestions in a spell checker?</a></p>