В рамках моей работы я работаю с очень большими текстовыми файлами и, частично, анализирую их на частоту слов и фраз. У меня возникают трудности с вычислением времени, ограничениями памяти и извлечением релевантной информации.
Для этой программы я беру большой текстовый файл (скажем, 50 МБ), который уже был очищен, превратился в нижний регистр. Но в остальном это просто неструктурированный текст. Я пытаюсь создать списки "bigrams" , "триграммы", "quadgrams" и "fivegrams" - соответственно, комбинации повторяющихся двух, трех, четырех и пяти словосочетаний (т.е. "я" - это bigram ", я свободен" - это триграмма, "я свободен всегда" - это квадрат).
Что я сейчас делаю?
Вот мой текущий код, где inputlower
- все строчные строковые строки (очищенные веб-данные w/Mathematica).
inputlower=Import["/directory/allTextLowered.txt"];
bigrams =
Sort[Tally[Partition[inputlower, 2, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/bigrams.txt", bigrams];
Clear[bigrams];
trigrams =
Sort[Tally[Partition[inputlower, 3, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/trigrams.txt", trigrams];
Clear[trigrams];
quadgrams =
Sort[Tally[Partition[inputlower, 4, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/quadrams.txt", quadgrams];
Clear[quadgrams];
fivegrams =
Sort[Tally[Partition[inputlower, 5, 1]], #1[[2]] > #2[[2]] &];
Export["/directory/fivegrams.txt", fivegrams];
В некотором смысле, он работает хорошо: я получаю информацию, и в меньших масштабах я обнаружил, что этот код работает достаточно быстро, чтобы иметь что-то, приближающееся к работоспособной программе Manipulate[]
. Но когда мы имеем дело с большими входами...
Что не так, когда я использую большие файлы?
Самое главное, мои выходные файлы слишком велики, чтобы их можно было использовать. Есть ли способ указать точку прерывания в коде: например, я не хочу, чтобы какие-либо "bigrams" отображались только один раз? Если это все равно оставит слишком много информации, можно ли указать, что мне не нужны никакие "bigrams" в файле, если они не появятся более чем в 10 раз? т.е. если "мой сыр" появляется 20 раз, я хочу знать об этом, но если "i pad" появляется только один раз, возможно, потерять его сделает файл более управляемым?
Во-вторых, эти процессы занимают много времени: потребовалось более двух-трех часов, чтобы генерировать только файл bigram. Я подхожу к этой проблеме эффективным образом?
В-третьих, если у меня был большой файл bigram (~ 650MB +), содержащий всю информацию, есть ли способ для Mathematica получить доступ к информации, не загружая ее все в память, то есть взяв файл с именем bigrams.txt, что он содержит {{"i","am"},55}
, не опуская систему вниз?
Edit
[Начиная с 7 декабря 11, я удалил файл примера, который я установил, - благодаря всем снова]