Процесс мониторинга случаев [] на очень большом объеме информации - PullRequest
13 голосов
/ 18 октября 2011

В настоящее время я выполняю операции с очень большим объемом текста (~ 290 МБ простого текста в одном файле).После импорта в Mathematica 8 я в настоящее время начинаю операции по разбиению его на строчные слова и т. Д., Чтобы начать анализ текста.

Проблема в том, что эти процессы занимают много времени.Будет ли способ контролировать эти операции через Mathematica?Для операций с переменной я использовал ProgressIndicator и т. Д. Но это не так.Мой поиск документации и StackOverflow не привел к чему-либо похожему.

Далее я хотел бы отслеживать процесс выполнения команды Cases []:

input=Import["/users/USER/alltext.txt"];
wordList=Cases[StringSplit[ToLowerCase[input],Except[WordCharacter]],Except[""]];

Ответы [ 4 ]

11 голосов
/ 18 октября 2011

Что-то вроде StringCases[ToLowerCase[input], WordCharacter..] кажется немного быстрее. И я бы, вероятно, использовал DeleteCases[expr, ""] вместо Cases[expr, Except[""]].

10 голосов
/ 18 октября 2011

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

input = ExampleData[{"Text", "PrideAndPrejudice"}];

wordList =
  Module[{charCount = 0, wordCount = 0, allWords}
  , PrintTemporary[
      Row[
        { "Characters: "
        , ProgressIndicator[Dynamic[charCount], {0, StringLength@input}]
        }]]

  ; allWords = StringSplit[
        ToLowerCase[input]
      , (_ /; (++charCount; False)) | Except[WordCharacter]
      ]

  ; PrintTemporary[
      Row[
        { "Words:      "
        , ProgressIndicator[Dynamic[wordCount], {0, Length@allWords}]
        }]]

  ; Cases[allWords, (_ /; (++wordCount; False)) | Except[""]]

  ]

Ключом к технике является то, что шаблоны, используемые в обоих случаях, совпадают с подстановочным знаком _. Однако этот подстановочный знак защищен условием, которое всегда терпит неудачу - но только до тех пор, пока он не увеличит счетчик как побочный эффект. Условие «реального» соответствия затем обрабатывается как альтернатива.

5 голосов
/ 18 октября 2011

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

Module[{list, t = 0},
 list = ReadList["/users/USER/alltext.txt", "String"];
 Monitor[wordlist = 
   Flatten@Table[
     StringCases[ToLowerCase[list[[t]]], WordCharacter ..], 
      {t, Length[list]}], 
  Labeled[ProgressIndicator[t/Length[list]], N@t/Length[list], Right]];
 Print["Ready"]] 

Для файла размером около 3 МБ это заняло лишь незначительно больше времени, чем предложено Джошуа.

4 голосов
/ 18 октября 2011

Я не знаю, как работает Cases, но List обработка может занять много времени, особенно если она строит List, как она есть. Поскольку в обработанном выражении присутствует неизвестное число терминов, вероятно, именно это происходит с Cases. Итак, я бы попробовал что-то немного другое: заменить "" на Sequence[]. Например, это List

{"5", "6", "7", Sequence[]}

становится

{"5", "6", "7"}.

Итак, попробуйте

bigList /. "" -> Sequence[]

он должен работать быстрее, поскольку он не создает большой List из ничего.

...