поиск строки, содержащей 6 слов для реальных слов

1

Я импортирую файл словаря, содержащий слова, которые я читаю как массив. Затем я хочу найти 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", чтобы найти возможные совпадения, но, похоже, не получилось никаких результатов. Код довольно грязный

  • 0
    что ты сделал до сих пор? покажи нам какой-нибудь код?
Теги:

2 ответа

1
Лучший ответ

Надеюсь, это поможет, это очень наивная реализация, но может быть полезной в качестве начальной точки.

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
  • 0
    Это, кажется, работает, это продолжалось с 2: 45ET прошлой ночью. Решений пока нет. До вашего исправления он находил 8+ матчей, и теперь я предполагаю, что будет только несколько возможных.
  • 0
    Удивительно, но он все еще работает. Я не думаю, что будет реальный ответ на эту борьбу слов / предложений. По общему мнению, одна буква неверна, но, думаю, я узнаю, когда она закончится.
0

Я думаю, что ваш код правильный, но проблема в том, что есть N! (N! = N * (N-1) * (N-2) *.. * 2 * 1) перестановки N элементов.

В вашем случае вы переставляете 37 элементов:

37!=13763753091226345046315979581580902400000000 

поэтому ваш код займет довольно много времени, чтобы найти полезные ответы.

Что может работать лучше, так это попытаться построить правильные фразы, отслеживая, сколько из каждого типа письма вы имеете.

Идея заключалась бы в создании рекурсивной функции, которая пытается произвести все фразы k-слова с учетом количества каждого типа письма, которое у вас есть:

1) По очереди переверните каждое слово в словаре

2) Если у вас недостаточно букв, чтобы сделать слово, перейдите к следующему слову и вернитесь к шагу 1

3) Если у вас достаточно писем, создайте новую коллекцию, содержащую оставшиеся буквы.

4) Если k = 1, то вы достигли нижней части рекурсии и можете распечатать результат

5) В противном случае вы можете рекурсивно вызвать функцию, чтобы сделать фразу из слова k-1 из коллекции остальных букв.

  • 0
    Это была большая проблема, когда я решил, что это займет так много времени. В то время как в этой 37-символьной строке имеется около 10 ^ 43 перестановок, каждая перестановка сравнивается с ~ 173K слов в массиве словаря. Это займет время.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню