Сингулярное разложение (SVD) в PHP

Если вы хотите остановить выполнение вашего приложения более одного раза в в одно и то же время (поместите код в файл *. Dpr ] проекта). отобразит сообщение после запуска второго приложения и мгновенно остановит его.

Forms,
  Unit1 in 'Unit1.pas' {Form1},
// add this units ....
TlHelp32,SysUtils,Windows,Dialogs;

{$R *.res}


function ProcessCount(const ExeName: String): Integer;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  FSnapshotHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize:= SizeOf(FProcessEntry32);
  ContinueLoop:= Process32First(FSnapshotHandle, FProcessEntry32);
  Result:= 0;
  while Integer(ContinueLoop) <> 0 do begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeName))) then Inc(Result);
    ContinueLoop:= Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;


begin
  if ProcessCount(ExtractFileName(Application.ExeName)) > 1 then begin
    MessageDlg('Application is already running!', mtError, [mbOK], 0);
    Application.Terminate;
  end else begin

  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
  end;

end.
9
задан caw 6 June 2009 в 16:25
поделиться

5 ответов

SVD-питон Это очень четкая и экономная реализация СВД. Это практически псевдокод, и его довольно легко понять. и сравните / воспользуйтесь своей реализацией php, даже если вы плохо разбираетесь в python.

SVD-python

Тем не менее, как упоминали другие, я не ожидал, что смогу выполнять очень тяжелые LSA с реализацией php, что звучит как довольно ограниченный веб-хост.

Ура

Изменить: Вышеприведенный модуль сам по себе ничего не делает, но есть пример, включенный в вводные комментарии. Предполагая, что вы загрузили модуль python и он был доступен (например, в той же папке), вы можно реализовать тривиальный пример, как показано ниже,

#!/usr/bin/python
import svd
import math

a = [[22.,10., 2.,  3., 7.],
     [14., 7.,10.,  0., 8.],
     [-1.,13.,-1.,-11., 3.],
     [-3.,-2.,13., -2., 4.],
     [ 9., 8., 1., -2., 4.],
     [ 9., 1.,-7.,  5.,-1.],
     [ 2.,-6., 6.,  5., 1.],
     [ 4., 5., 0., -2., 2.]]

u,w,vt = svd.svd(a)
print w

Здесь 'w' содержит ваш список сингулярных значений.
Конечно, это лишь часть пути к латентному семантическому анализу и его родственникам. Обычно вы хотите уменьшить количество сингулярных значений, а затем использовать некоторое подходящее расстояние метрика для измерения сходства между вашими документами, словами, документами и словами и т. д. Косинус угла между вашими результирующими векторами довольно популярен.

Latent Semantic Mapping (pdf)

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

Edit2: также обратите внимание, что если вы работаете с очень большими матрицами терминов-документов (я предполагаю, что это это то, что вы делаете) почти наверняка будет намного эффективнее выполнить разложение в автономном режиме, а затем выполнять только сравнения в режиме реального времени в ответ на запросы. в то время как svd-python отлично подходит для обучения, svdlibc - это больше, чем вы хотели бы для таких тяжелых вычисление.

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

в любом случае удачи!

9
ответ дан 4 December 2019 в 10:34
поделиться

Относительно вопроса 1: Определенно возможно. Насколько это разумно, зависит от вашего сценария: насколько велики ваши матрицы? Как часто вы собираетесь запускать код? Он запускается на веб-сайте или из командной строки? Если вас действительно волнует скорость, я бы посоветовал написать простое расширение , которое обертывает вызовы научной библиотеки GNU .

2
ответ дан 4 December 2019 в 10:34
поделиться

Будьте осторожны, когда говорите: «Мне все равно, каковы временные рамки». SVD - это операция O (N ^ 3) (или O (MN ^ 2) , если это прямоугольная матрица m * n ), что означает, что вы можете очень легко оказаться в ситуации, когда ваша проблема может занять очень много времени. Если случай 100 * 100 занимает одну минуту, случай 1000 * 1000 будет 10 ^ 3 минут или почти 17 часов (и, вероятно, хуже, реалистично, поскольку у вас, вероятно, закончится кеш). При использовании чего-то вроде PHP префактор - число, умножающее N ^ 3 для вычисления необходимого количества FLOP, может быть очень и очень большим.

Сказав это, конечно, можно запрограммируйте его на PHP - язык имеет необходимые структуры данных и операции.

5
ответ дан 4 December 2019 в 10:34
поделиться
  1. Да. это вполне возможно реализовать на PHP. Я не знаю, каковы разумные временные рамки для выполнения и насколько велики они могут вычислить. Мне, вероятно, пришлось бы реализовать алгоритм, чтобы получить правильную идею.

  2. Да, я могу помочь вам его написать. Но зачем тебе помощь? Разве написанный вами код не работает?

Просто вопрос в сторону. Какую версию PHP вы используете?

0
ответ дан 4 December 2019 в 10:34
поделиться

Да, это возможно, но реализация SVD на php не является оптимальным подходом. Как вы можете видеть здесь, PHP медленнее, чем C, а также медленнее, чем C ++, поэтому, возможно, было бы лучше, если бы вы могли сделать это на одном из этих языков и вызвать их как функцию для получения результатов. Вы можете найти реализацию алгоритма здесь , так что вы можете пройти через нее.

О вызове функции можно использовать:

  • Функция exec ()

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

  • Функция system ()

Системная функция в PHP принимает строковый аргумент с командой для выполнения, а также любые аргументы, которые вы хотите передать этой команде. Эта функция выполняет указанную команду и выгружает полученный текст в выходной поток (либо вывод HTTP в ситуации веб-сервера, либо консоль, если вы используете PHP как инструмент командной строки). Возврат этой функции - последняя строка вывода программы, если она выводит текст.

  • Функция passthru ()

Одна интересная функция, предоставляемая PHP, аналогичная тем, что мы видели до сих пор, - это функция passthru . Эта функция, как и другие, выполняет указанную вами программу. Однако затем он немедленно переходит к отправке необработанных выходных данных этой программы в выходной поток, с которым в настоящее время работает PHP (т.е.

1
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: