作为我工作的一部分,我正在处理非常大的文本文件,并在一定程度上分析它们的单词和短语频率.我遇到了计算时间,内存限制和提取相关信息的困难.
对于这个程序,我正在处理一个已经清理过的大文本文件(比如50MB),变成小写.但除此之外它只是非结构化的文本.我试图生成'bigrams','trigrams,'quadgrams'和'fivegrams'的列表 - 分别是经常出现的两个,三个,四个和五个单词短语的组合(即"我是"是一个二重奏,"我是自由的"是一个三元组,"我自由总是"是一个四元组".
我现在在做什么?
这是我当前的代码,其中inputlower是一个全小写字符串(使用Mathematica抓取的Web数据).
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];
Run Code Online (Sandbox Code Playgroud)
在某种程度上,它运作良好:我确实得到了生成的信息,并且在较小的尺度上,我发现这个代码工作得足够快,我可以得到一些近似于可行Manipulate[]程序的东西.但是,当我们处理大量投入时......
使用大文件时有什么问题?
最重要的是,我的输出文件太大而无法使用.有没有办法在代码中指定一个断点:例如,我不想要任何只出现一次的'bigrams'?如果证明仍然留下太多信息,是否有办法指明我不希望文件中有任何"bigrams",除非它们出现的次数超过10次?即如果"我的奶酪"出现20次,我想知道它,但如果"我垫"只出现一次,也许失去它会使文件更易于管理?
其次,这些过程需要很长时间:单独生成二元输出需要两到三个小时.我是否以有效的方式解决这个问题?
第三,如果我确实有一个包含所有信息的大型bigram文件(~650MB +),Mathematica是否有办法访问信息而不将其全部加载到内存中 - 即获取名为bigrams.txt的文件,了解它包含{{"i","am"},55}没有阻塞系统?
编辑
[截至12月7日,我删除了我提出的示例文件 - 再次感谢所有人]
有没有人知道Mathematica中是否有内置函数来获取低值规则的lhs(没有任何持有)?我知道如何编写代码来实现它,但对于内置代码来说它似乎已经基本了
例如:
a[1]=2;
a[2]=3;
Run Code Online (Sandbox Code Playgroud)
BuiltInIDoNotKnowOf[a] 回报 {1,2}