Я импортирую файл словаря, содержащий слова, которые я читаю как массив. Затем я хочу найти 6-словную фразу, генерируемую функцией перестановки для каждого из этих слов, и распечатать, если совпадение найдено из массива словаря ни с одним из слов в фразе. Если бы я мог распечатать, только если он найдет совпадения для всей фразы, которая была бы предпочтительнее. Результат перестановки приводит к строке из 6 слов, разделенных пробелами.
благодаря
import itertools
import array
arr=[]
f = file('/home/kyle/dictionary.csv').readlines()
for i in range(len(f)):
arr.append(f[i].rstrip('\n').rstrip('\r').split(','))
for a in range(0, len(arr)):
print arr[a]
s=['e','k','y','a','v','y','a','a','o','s','r','h','t','n','i','k','h','t','s','t','e','n','i','p','p','l','e','h','d','c','t','e','f','a','t','t','l']
for L in range(1, len(s)+1):
for subset in itertools.permutations(s, 37):
x=( "".join(subset))
s=x[:5] + ' ' + x[5:]
s=s[:16] + ' ' + s[16:]
s=s[:20] + ' ' + s[20:]
s=s[:27] + ' ' + s[27:]
s=s[:31] + ' ' + s[31:]
s=s[:35] + ' ' + s[35:]
for c in range(0,len(arr)):
test=str(arr[c])
if test in s:
print s
Нижняя часть играла с "in", чтобы найти возможные совпадения, но, похоже, не получилось никаких результатов. Код довольно грязный
Надеюсь, это поможет, это очень наивная реализация, но может быть полезной в качестве начальной точки.
In [2]: words = ['word1', 'word2', 'word3', 'word4', 'word5', 'word6', 'word7']
In [3]: phrase1 = 'bla bla word1 bla word2 bla word7'
In [4]: phrase2 = 'bla bla word1 bla word2 bla word7 word6, word4 word3'
In [5]: def match(phrase):
...: n_matches = 0
...: for w in words:
...: if w in phrase:
...: n_matches += 1
...: return n_matches == 6
...:
In [6]: match(phrase1)
Out[6]: False
In [7]: match(phrase2)
Out[7]: True
Проблема в том, что мы находим подстроки:
In [8]: phrase3 = 'bla bla word1 bla word2 bla word7 word6, word4 word3failed'
In [9]: match(phrase3)
Out[9]: True
И я исправил этот путь:
In [22]: import re
In [25]: tokenize_words = re.compile(r'\w+')
In [30]: def match(phrase):
....: n_matches = 0
....: phrase_words = tokenize_words.findall(phrase)
....: for w in words:
....: if w in phrase_words:
....: n_matches += 1
....: return n_matches == 6
....:
In [31]: match(phrase2)
Out[31]: True
In [32]: match(phrase3)
Out[32]: False
In [33]: match(phrase1)
Out[33]: False
Я думаю, что ваш код правильный, но проблема в том, что есть N! (N! = N * (N-1) * (N-2) *.. * 2 * 1) перестановки N элементов.
В вашем случае вы переставляете 37 элементов:
37!=13763753091226345046315979581580902400000000
поэтому ваш код займет довольно много времени, чтобы найти полезные ответы.
Что может работать лучше, так это попытаться построить правильные фразы, отслеживая, сколько из каждого типа письма вы имеете.
Идея заключалась бы в создании рекурсивной функции, которая пытается произвести все фразы k-слова с учетом количества каждого типа письма, которое у вас есть:
1) По очереди переверните каждое слово в словаре
2) Если у вас недостаточно букв, чтобы сделать слово, перейдите к следующему слову и вернитесь к шагу 1
3) Если у вас достаточно писем, создайте новую коллекцию, содержащую оставшиеся буквы.
4) Если k = 1, то вы достигли нижней части рекурсии и можете распечатать результат
5) В противном случае вы можете рекурсивно вызвать функцию, чтобы сделать фразу из слова k-1 из коллекции остальных букв.