Получение PHP считать .doc файлы на Linux

Я не мог понять, почему нет предлагаемого чистого numpy способа заставить это работать. Поэтому я нашел один, который использует широковещательную передачу numpy. Основная идея - преобразовать один из массивов в 3d путем замены осей. Давайте построим 2 массива:

a=np.random.randint(10, size=(5, 3))
b=np.zeros_like(a)
b[:4,:]=a[np.random.randint(a.shape[0], size=4), :]

С моим запуском он дал:

a=array([[5, 6, 3],
   [8, 1, 0],
   [2, 1, 4],
   [8, 0, 6],
   [6, 7, 6]])
b=array([[2, 1, 4],
   [2, 1, 4],
   [6, 7, 6],
   [5, 6, 3],
   [0, 0, 0]])

Шаги (массивы могут быть взаимозаменяемы):

#a is nxm and b is kxm
c = np.swapaxes(a[:,:,None],1,2)==b #transform a to nx1xm
# c has nxkxm dimensions due to comparison broadcast
# each nxixj slice holds comparison matrix between a[j,:] and b[i,:]
# Decrease dimension to nxk with product:
c = np.prod(c,axis=2)
#To get around duplicates://
# Calculate cumulative sum in k-th dimension
c= c*np.cumsum(c,axis=0)
# compare with 1, so that to get only one 'True' statement by row
c=c==1
#//
# sum in k-th dimension, so that a nx1 vector is produced
c=np.sum(c,axis=1).astype(bool)
# The intersection between a and b is a[c]
result=a[c]

В функции с 2 строками для уменьшения используемой памяти (исправьте меня, если не так):

def array_row_intersection(a,b):
   tmp=np.prod(np.swapaxes(a[:,:,None],1,2)==b,axis=2)
   return a[np.sum(np.cumsum(tmp,axis=0)*tmp==1,axis=1).astype(bool)]

, который дал результат для моего примера:

result=array([[5, 6, 3],
       [2, 1, 4],
       [6, 7, 6]])

Это быстрее, чем установлено решений, поскольку он использует только простые операции numpy, в то время как он уменьшает постоянство размеров и идеально подходит для двух больших матриц. Наверное, я мог ошибаться в своих комментариях, так как получил ответ от экспериментов и инстинкта. Эквивалент для пересечения столбцов можно найти либо путем переноса массивов, либо путем небольшого изменения шагов. Кроме того, если нужны дубликаты, тогда шаги внутри «//» должны быть пропущены. Функция может быть отредактирована, чтобы возвращать только булевский массив индексов, который мне пригодился, пытаясь получить разные индексы массивов с одним и тем же вектором. Контрольный показатель для проголосовавшего ответа и моего (количество элементов в каждом измерении играет роль в выборе):

Код:

def voted_answer(A,B):
    nrows, ncols = A.shape
    dtype={'names':['f{}'.format(i) for i in range(ncols)],
           'formats':ncols * [A.dtype]}
    C = np.intersect1d(A.view(dtype), B.view(dtype))
    return C.view(A.dtype).reshape(-1, ncols)

a_small=np.random.randint(10, size=(10, 10))
b_small=np.zeros_like(a_small)
b_small=a_small[np.random.randint(a_small.shape[0],size=[a_small.shape[0]]),:]
a_big_row=np.random.randint(10, size=(10, 1000))
b_big_row=a_big_row[np.random.randint(a_big_row.shape[0],size=[a_big_row.shape[0]]),:]
a_big_col=np.random.randint(10, size=(1000, 10))
b_big_col=a_big_col[np.random.randint(a_big_col.shape[0],size=[a_big_col.shape[0]]),:]
a_big_all=np.random.randint(10, size=(100,100))
b_big_all=a_big_all[np.random.randint(a_big_all.shape[0],size=[a_big_all.shape[0]]),:]



print 'Small arrays:'
print '\t Voted answer:',timeit.timeit(lambda:voted_answer(a_small,b_small),number=100)/100
print '\t Proposed answer:',timeit.timeit(lambda:array_row_intersection(a_small,b_small),number=100)/100
print 'Big column arrays:'
print '\t Voted answer:',timeit.timeit(lambda:voted_answer(a_big_col,b_big_col),number=100)/100
print '\t Proposed answer:',timeit.timeit(lambda:array_row_intersection(a_big_col,b_big_col),number=100)/100
print 'Big row arrays:'
print '\t Voted answer:',timeit.timeit(lambda:voted_answer(a_big_row,b_big_row),number=100)/100
print '\t Proposed answer:',timeit.timeit(lambda:array_row_intersection(a_big_row,b_big_row),number=100)/100
print 'Big arrays:'
print '\t Voted answer:',timeit.timeit(lambda:voted_answer(a_big_all,b_big_all),number=100)/100
print '\t Proposed answer:',timeit.timeit(lambda:array_row_intersection(a_big_all,b_big_all),number=100)/100

с результатами:

Small arrays:
     Voted answer: 7.47108459473e-05
     Proposed answer: 2.47001647949e-05
Big column arrays:
     Voted answer: 0.00198730945587
     Proposed answer: 0.0560171294212
Big row arrays:
     Voted answer: 0.00500325918198
     Proposed answer: 0.000308241844177
Big arrays:
     Voted answer: 0.000864889621735
     Proposed answer: 0.00257176160812

После вынесения вердикта следует, что если вам нужно сравнить 2 больших 2d массива из 2d точек, используйте голосовой ответ. Если у вас большие матрицы во всех измерениях, проголосовавший ответ - лучший из всех. Таким образом, это зависит от того, что вы выбираете каждый раз.

5
задан Conor 18 September 2008 в 05:48
поделиться

7 ответов

Кажется, существует библиотека для доступа к документам Word, но не уверена, как получить доступ к нему от PHP. Я думаю, что лучшее решение состояло бы в том, чтобы назвать их команду wv от PHP.

3
ответ дан 18 December 2019 в 13:21
поделиться

Conor, я предложил бы посмотреть на интерфейс командной строки OpenOffice / вызов макросов. Это может преобразовать много форматов файлов во многих других. Затем можно выбрать что-то намного более способное синтаксическим анализом, чем документ MS.

Например, для преобразования в PDF командная строка:

/usr/lib/ooo-2.0/program/soffice.bin -norestore -nofirststart -nologo -headless -invisible   "macro:///Standard.Module1.SaveAsPDF(demo.doc)"
7
ответ дан 18 December 2019 в 13:21
поделиться

Можно использовать антислово или AbiWord, чтобы вытащить текст и подать его к любимому полнотекстовому индексатору. AbiWord является, вероятно, более эффективным в Ваших целях, потому что он может преобразовать в RTF, PDF и другие форматы (да, это - текстовой процессор GUI, но он также поддерживает использование командной строки).

1
ответ дан 18 December 2019 в 13:21
поделиться

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

Поочередно, можно получить OpenOffice и открыть документы MS Word, и просто Файл> Сохраняет как> RTF.

0
ответ дан 18 December 2019 в 13:21
поделиться

Файлы DOC хранятся в двоичном формате, который не было никого просто php записанные классы имея дело с ними.

Файлы RTF намного легче проанализировать, будучи главным образом текстом, можно просто открыть их с fopen и считать содержание.

Я предложил бы использовать RTF, если Вы можете, поскольку действительно еще нет звукового решения для файлов DOC.

0
ответ дан 18 December 2019 в 13:21
поделиться

phpLiveDocx - это компонент Zend Framework, который может читать и записывать файлы DOC и RTF в PHP в Linux, Windows и Mac. Кроме того, вы можете использовать его для создания файлов PDF и даже объединения данных из PHP в файлы шаблонов, созданные с помощью MS Word или Open Office!

См. Веб-сайт проекта по адресу:

http://www.phplivedocx.org

2
ответ дан 18 December 2019 в 13:21
поделиться

Я нашел пакет unoconv в Ubuntu. Он выполняет преобразование между всеми форматами, поддерживаемыми OpenOffice. Вы должны иметь возможность использовать exec в php для запуска этой утилиты.

.
1
ответ дан 18 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

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