Преобразование сценария Markov Chain Python в PHP. Не уверен, какие некоторые из эквивалентных функций есть в PHP

#php #python #markov-chains

#php #python #markov-chains

Вопрос:

Я видел этот детектор тарабарщины цепочки Маркова, написанный в ответ на другой вопрос о Stackoverflow, и я хотел бы преобразовать его в PHP, я не ищу кого-то, кто сделал бы это за меня, но меня смущают части кода Python, о которых я ничего не знаю. Я просмотрел документы python, но это еще больше меня смущает.

  1. Что такое PHP-эквивалент yield?
     def ngram(n, l):
    """ Return all n grams from l after normalizing """
    filtered = normalize(l)
    for start in range(0, len(filtered) - n   1):
        yield ''.join(filtered[start:start   n])
     
  2. Что именно такое xrange? Существует расширение PECL, однако я бы предпочел чистую реализацию PHP? Возможно ли это?
     counts = [[10 for i in xrange(k)] for i in xrange(k)]
    
    for i, row in enumerate(counts):
    s = float(sum(row))
    for j in xrange(len(row)):
        row[j] = math.log(row[j] / s)
     
  3. Что делает assert? Это эквивалент создания исключения?
     assert min(good_probs) > max(bad_probs)
     
  4. Python Pickle, это по сути сериализация?
     pickle.dump({'mat': counts, 'thresh': thresh}, open('gib_model.pki', 'wb'))
     

Спасибо за любую помощь.


Редактировать: опечатки.

Ответ №1:

1. Что такое PHP-эквивалент yield?

В PHP нет эквивалента yield . yield используется в функциях генератора — специальном классе функций, который возвращает результат, но сохраняет его состояние.

Например:

 def simple_generator(start=0, end=100):
    while start < end:
        start  = 1
        yield start
gen = simple_generator()
gen() # 1
gen() # 2
gen() # 3
 

Вы можете сделать что-то подобное в PHP следующим образом:

 class simple_generator {
    private $start;
    private $end;
    function __construct($start=0, $end=100) {
        $this->start = $start;
        $this->end = $end;
    }
    function __call() {
        if($this->start < $this->end) {
            $this->start  ;
            return $start;
        }
    }
}
gen = simple_generator();
gen(); // 1
gen(); // 2
 

2. Что такое xrange?

xrange ведет себя так же, как range , но использует функцию генератора. Это настройка производительности для работы с очень большими списками или при нехватке памяти.

3. Что делает assert? Это эквивалент выброса и исключения?

ДА. Будьте осторожны — это не то же самое, что PHP assert , что является действительно интересным вектором для атак на ваше программное обеспечение.

4. Python Pickle, это по сути сериализация?

ДА.

Комментарии:

1. Что касается вашего ответа на вопрос 1. Я вижу, что вы также можете использовать статическое значение $start = 0;, установленное в функции php.

2. @buggedcom: static Что касается генераторов: Нет, вы не можете использовать static для этого. То есть, если вы не хотите ограничиться только одним экземпляром, не подлежащим сбросу , для всего процесса . Несколько сохраненных строк редко, если вообще когда-либо, стоят того.

Ответ №2:

  1. xrange возвращает итератор. Это отличается от range, который возвращает список. Оба ведут себя в основном одинаково, поэтому просто используйте его так, как вы используете range.
  2. ДА
  3. ДА

Комментарии:

1. @buggedcom: исходный код ответа подразумевает «да» (первый элемент пронумерован 2). Для лучшего или для wrose, markdown игнорирует такие «ошибки» нумерации и просто отображает 1..3 вместо 2..4 .