我目前正在对一大块文本进行操作(一个文件中有大约290MB的纯文本)。在将其导入Mathematica 8之后,我现在开始将其分解为小写单词等等,因此我可以开始进行文本分析。
问题是这些过程需要很长时间。有没有办法通过Mathematica监控这些操作?对于带变量的操作,我使用了ProgressIndicator等。但这是不同的。我对文档和StackOverflow的搜索没有发现类似的东西。
在下文中,我想监视Cases []命令的过程:
input=Import["/users/USER/alltext.txt"];
wordList=Cases[StringSplit[ToLowerCase[input],Except[WordCharacter]],Except[""]];
答案 0 :(得分:11)
像StringCases[ToLowerCase[input], WordCharacter..]
这样的东西似乎要快一点。我可能会使用DeleteCases[expr, ""]
代替Cases[expr, Except[""]]
。
答案 1 :(得分:10)
通过在匹配的模式中注入“计数器”操作,可以查看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[""]]
]
该技术的关键是两种情况下使用的模式都与通配符_
匹配。但是,该通配符由始终失败的条件保护 - 但直到它将计数器增加为副作用。然后处理“真实”匹配条件作为替代。
答案 2 :(得分:5)
这取决于你的文本是什么样的,但你可以尝试将文本拆分成块并迭代它们。然后,您可以使用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 MB的文件上,这比Joshua的建议只花了不少时间。
答案 3 :(得分:4)
我不知道Cases
的工作原理,但List
处理可能非常耗时,尤其是当它正在构建List
时。由于处理过的表达式中存在未知数量的术语,因此Cases
可能会发生这种情况。所以,我会尝试稍微不同的东西:用Sequence[]
替换“”。例如,这个List
{"5", "6", "7", Sequence[]}
变为
{"5", "6", "7"}.
所以,试试
bigList /. "" -> Sequence[]
它应该运行得更快,因为它不会从零开始构建一个大的List
。