作为我工作的一部分,我正在处理非常大的文本文件,并在一定程度上分析它们的单词和短语频率.我遇到了计算时间,内存限制和提取相关信息的困难.
对于这个程序,我正在处理一个已经清理过的大文本文件(比如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日,我删除了我提出的示例文件 - 再次感谢所有人]
圣路易斯联邦储备银行在各种网页上提供了大量数据,例如:
http://research.stlouisfed.org/fred2/series/OILPRICE/downloaddata?cid=32217 http://www.federalreserve.gov/releases/h10/summary/default.htm http://research.stlouisfed.org/ fred2 /系列/ DGS20
数据集会更新,有些甚至每天都会更新.我倾向于对每日数据感兴趣(请参阅URLS上的上述设置)
我想将这些价格或费率数据流(可在上述URL中作为CSV或Excel文件访问)直接导入Mathematica.
我已经查看了有关Importing []的文档,但我找不到关于如何进行此类操作的文档(实际上没有).
看起来我需要导航到页面,发送一些数据来选择特定的文件和格式,触发下载,然后从我自己的机器访问下载的数据.如果我可以直接从站点访问数据,那就更好了.
我曾希望Wolfram Alpha可以轻松做到这一点,但我没有取得任何成功.
FinancialData[]对于这类事情来说似乎很自然,但我还是没有看到这样做.财务数据有很多功能,但我没有看到你得到这种东西的方式.
有没有人有这方面的经验或有人指出我正确的方向?
我目前正在对大量文本进行操作(在一个文件中大约290MB的纯文本).在将其导入Mathematica 8之后,我现在开始将其分解为小写单词等,因此我可以开始进行文本分析.
问题是这些过程需要很长时间.有没有办法通过Mathematica监控这些操作?对于带变量的操作,我使用了ProgressIndicator等.但这是不同的.我搜索文档和StackOverflow没有发现类似的东西.
在下面,我想监视Cases []命令的过程:
input=Import["/users/USER/alltext.txt"];
wordList=Cases[StringSplit[ToLowerCase[input],Except[WordCharacter]],Except[""]];
Run Code Online (Sandbox Code Playgroud) 这似乎应该是一个显而易见的问题,但列表上的教程和文档不会出现.其中许多问题源于我的文本文件的大小(数百MB)以及我试图将它们归结为我的系统可管理的东西.结果,我正在分段工作,现在正试图将结果结合起来.
我有多个单词频率列表(约40个).列表可以通过Import []获取,也可以作为Mathematica中生成的变量获取.每个列表显示如下,并使用Tally []和Sort []命令生成:
{{"the",42216},{"of",24903},{"和",18624},{"n",16850},{"in",
16164},{"de",14930},{ "a",14660},{"to",14175},{"la",7347},{"was",6030},{"l",5981},{"le",5735},<< 51293 >>,{"abattoir",1},{"abattement",1},{"abattagen",1},{"abattage",1},{"abated",1},{"abandonn",1} ,{"abaiss",1},{"aback",1},{"aase",1},{"aaijaut",1},{"aaaah",1},{"aaa",1}}
以下是第二个文件的示例:
{{"the",30419},{"n",20414},{"de",19956},{"of",16262},{"and",
14488},{"to",12726},{ "a",12635},{"in",11141},{"la",10739},{"et",9016},{"les",8675},{"le",7748},<< 101032 >>,{"abattement",1},{"abattagen",1},{"abattage",1},{"abated",1},{"abandonn",1},{"abaiss",1} ,{"aback",1},{"aase",1},{"aaijaut",1},{"aaaah",1},{"aaa",1}}
我想将它们组合起来,以便频率数据聚合:即如果第二个文件有30,419次出现''并且加入第一个文件,它应该返回有72,635次出现(依此类推,因为我在整个文件中移动)采集).
我正在尝试在Mathematica 8(12k +)中搜索大量文本文件.到目前为止,我已经能够绘制一个单词出现的绝对次数(即"爱"这个单词在这些12k文件中出现5000次).但是,我很难确定"爱"出现一次的文件数量 - 这可能只有1,000个文件,而在其他文件中重复几次.
我发现文档WRT FindList,流,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"]
Run Code Online (Sandbox Code Playgroud)
非常感谢.这是我的第一篇文章,我主要通过同行/监督帮助,在线教程和文档来学习Mathematica.
我正在使用Mathematica处理大量的网站文件,我已将其镜像到我自己的系统上.它们分布在数百个目录中,有大量的子目录.例如,我有:
/users/me/test/directory1
/users/me/test/directory1/subdirectory2 [times a hundred]
/users/me/test/directory2
/users/me/test/directory2/subdirectory5 [etc. etc.]
Run Code Online (Sandbox Code Playgroud)
我需要做的是进入每个目录,将Import[]所有HTML文件作为纯文本,然后将它们放在我的系统上以"directory1"命名的其他目录中.到目前为止,通过Do[]循环,我已经能够做一个粗略的版本:然而,我现在最好的情况是将".txt"文件转储到原始目录中,这不是一个理想的解决方案,因为它们仍然是遍布我的系统.
要查找我的文件,我使用 directoryfiles = FileNames["*.htm*", {"*"}, Infinity];
一些额外的烦恼问题:
(1)重复:Mathematica是否有办法处理重复项 - 即如果我们遇到另一个index_en.html,它是否可以重命名为index_en_1.html?
(2)目录:因为所有的目录,除非我用数学来不断地SetDirectory和CreateDirectory一遍又一遍,但继续运行陷入困境.
这一切似乎有点令人困惑.基本上,Mathematica是否有一种有效的方法可以找到分布在数百个目录/子目录中的大量HTML文件,将它们作为纯文本导入,然后将它们导出到其他地方[对我来说知道它们来自directory1非常重要,但就是这样] .
- 为清晰起见编辑 -
这是我目前的代码:
SetDirectory[
"/users/me/web/"];
dirlist = FileNames[];
directoryPrefix =
"/users/me/web/";
plainHTMLBucket = "";
Do[
directory = directoryPrefix <> dirname;
exportPrefix =
"/users/me/desktop/bucket/";
SetDirectory[directory];
allFiles = FileNames["*.htm*", {"*"}, Infinity];
plainHTMLBucket = "";
Do[
plainHTML = Import[filename, "Plaintext"];
plainHTMLBucket = AppendTo[plainHTMLBucket, plainHTML];
, {filename, allFiles}];
Export[exportPrefix <> dirname …Run Code Online (Sandbox Code Playgroud) 在对列表操作的文档/过去问题进行管道调查后,我发现空白 - 许多案例涉及数字,而我正在处理大量文本.
我有一个常见的三字短语(三字母)的排序列表,它出现在大量的文本信息中,通过Mathematica的Partition [],Tally []和Sort []命令生成.我正在操作的数据类型的一个示例(我有数百个这样的文件):
{{{wa,wa,wa},66},{{i,love,you},62},{{la,la,la},50},{{meaning,of,life},42},{ on,come,on},40},{{come,on,come},40},{{是的,是的,是的},38},{{不,不,不是},36},{{我们, re,gonna},36},{{you,love,me},35},{{in,love,with},32},{{the,way,you},30},{{i,want,and to},30},{{back,to,me},29},<< 38211 >>,{{of,an,xke},1}}
我希望搜索这个文件,这样如果输入是"意义,生命",它将返回"42".我觉得我必须忽略一些明显的东西,但在修补过后我在这里碰了一堵砖墙.Mathematica在其文档中数量很多,这是......好吧,不足为奇.
这是一个更普遍的问题,但它对我正在运行的数据挖掘项目有更广泛的影响.我一直在使用wget镜像归档网页进行分析.这是一个大量的数据,我目前的镜像过程已经持续了将近一个星期.这给了我很多时间来观看读数.
wget如何确定下载页面的顺序?我似乎无法辨别其决策制定过程的一致性逻辑(它不按字母顺序,按原始网站创建日期或文件类型进行).当我开始处理数据时,这将非常有助于掌握.
FWIW,这是我正在使用的命令(它需要cookie,而网站的TOS允许以任何方式"访问"我不想冒任何机会) - 其中SITE = URL:
wget -m --cookies=on --keep-session-cookies --load-cookies=cookie3.txt --save-cookies=cookie4.txt --referer=SITE --random-wait --wait=1 --limit-rate=30K --user-agent="Mozilla 4.0" SITE
Run Code Online (Sandbox Code Playgroud)
编辑添加:在对Chown的有用答案的评论中,我稍微改进了我的问题,所以在这里.有更大的网站 - 比如epe.lac-bac.gc.ca/100/205/301/ic/cdc/E/Alphabet.asp - 我发现它最初创建了一个目录结构和一些index.html/default.html页面,然后再回到不同的网站几次(例如,在每次传递时抓取更多的图像和子页面)
我有一个带有unicode行分隔符(十六进制代码2028)的文本文件。
我想使用bash删除它(我看到了Python的实现,但没有该语言的实现)。我可以使用什么命令来转换文本文件(output4.txt)以丢失Unicode行分隔符?
参见下面的vim:

我一直在玩Mathematica的可视化和网络浏览功能.基于一些演示代码,我能够可视化网络.以下是大学网页上的示例:
webcrawler[rooturl_, depth_] :=
Flatten[Rest[NestList[
Union[Flatten[Thread[# -> Import[#,"Hyperlinks"]] & /@ Last /@ #]] &,
{"" -> rooturl}, depth]]];
Graph[webcrawler[
"http://www.yorku.ca/", 2], {ImageSize -> Full}]
Run Code Online (Sandbox Code Playgroud)
但是,我一直在努力寻找将EdgeLabels []应用于此Graph[]命令的方法.我想在每一行上写下每个链接,只是为了弄清楚链接簇代表什么.
我已经尝试将生成的Hyperlink连接列表应用到它,这不起作用,也没有任何来自文档/堆栈/ cookbook上其他地方的明显命令.
我想象一个非常杂乱的输出.