Поиск количества срочных появлений в Mathematica - PullRequest
6 голосов
/ 22 сентября 2011

Я пытаюсь найти большой массив текстовых файлов в Mathematica 8 (12k +).До сих пор я смог нанести на график огромное количество раз, когда слово появляется (то есть слово «любовь» встречается 5000 раз в этих файлах по 12 тыс.).Однако я сталкиваюсь с трудностями при определении количества файлов, в которых «любовь» появляется один раз - это может быть только в 1000 файлах, а в других повторяется несколько раз.

Я нахожу документацию WRTFindList, потоки, RecordSeparators и т. Д. Немного мутные.Есть ли способ настроить его так, чтобы он находил один термин в файле один раз, а затем переходил к следующему?

Пример списка файлов:

{"89001.txt",«89002.txt», «89003.txt», «89004.txt», «89005.txt», «89006.txt», «89007.txt», «89008.txt», «89009.txt», «89010.txt "," 89011.txt "," 89012.txt "," 89013.txt "," 89014.txt "," 89015.txt "," 89016.txt "," 89017.txt "," 89018.txt"," 89019.txt "," 89020.txt "," 89021.txt "," 89022.txt "," 89023.txt "," 89024.txt "}

Следующее возвращает вселинии с любовью в каждом файле.Есть ли способ вернуть только первое проявление любви в каждом файле, прежде чем перейти к следующему?

FindList[filelist, "love"]

Большое спасибо.Это мой первый пост, и я в основном изучаю Mathematica с помощью помощи сверстников / супервизоров, онлайн-учебников и документации.

Ответы [ 2 ]

9 голосов
/ 22 сентября 2011

В дополнение к ответу Даниэля вы также, похоже, запрашиваете список файлов, в которых слово встречается только один раз. Для этого я продолжил бы запускать FindList во всех файлах

res =FindList[filelist, "love"]

Затем уменьшите результаты до однострочных, через

lines = Select[ res, Length[#]==1& ]

Но это не исключает случаев, когда в одной строке более одного вхождения. Для этого вы можете использовать StringCount и принимать только те случаи, когда он равен 1, как показано ниже

Select[ lines, StringCount[ #, RegularExpression[ "\\blove\\b" ] ] == 1& ]

RegularExpression указывает, что слово «любовь» должно быть отдельным словом, использующим маркер границы слова (\\b), так что слова типа «прекрасный» не будут включены.

Редактировать : Похоже, что FindList при передаче списка файлов возвращает плоский список, поэтому вы не можете определить, какой элемент идет с каким файлом. Например, если у вас есть 3 файла и они содержат слова «любовь» 0, 1 и 2 раза соответственно, вы получите список, который выглядит как

{, love, love, love }

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

res = FindList[#, "love"]& /@ filelist

, а остальная часть приведенного выше кода работает как положено.

Но, если вы хотите связать результаты с именем файла, вам нужно его немного изменить.

res = {#, FindList[#, "love"]}& /@ filelist
lines = Select[res, 
         Length[ #[[2]] ] ==1 &&  (* <-- Note the use of [[2]] *)
         StringCount[ #[[2]], RegularExpression[ "\\blove\\b" ] ] == 1&
        ]

, который возвращает список вида

{ {filename, { "string with love in it" }, 
  {filename, { "string with love in it" }, ...}

Чтобы извлечь имена файлов, вы просто набираете lines[[All, 1]].

Обратите внимание, чтобы Select на свойства, которые вы хотели, я использовал Part ([[ ]]), чтобы указать второй элемент в каждом элементе данных, и то же самое касается извлечения файла имена.

4 голосов
/ 22 сентября 2011

Справка> Центр документации> Элемент FindList 4:

"FindList [files, text, n] содержит только первые найденные n строк."

Таким образом, вы можете установить n в 1.

Даниэль Лихтблау

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...