13

我目前正在对大量文本(一个文件中约 290MB 的纯文本)进行操作。将其导入 Mathematica 8 后,我目前正在开始将其分解为小写单词等操作,以便开始文本分析。

问题是这些过程需要很长时间。有没有办法通过 Mathematica 监控这些操作?对于带有变量的操作,我使用了 ProgressIndicator 等。但这是不同的。我对文档和 StackOverflow 的搜索没有发现任何类似的东西。

下面,我想监控一下 Cases[ ] 命令的执行过程:

input=Import["/users/USER/alltext.txt"];
wordList=Cases[StringSplit[ToLowerCase[input],Except[WordCharacter]],Except[""]];
4

4 回答 4

11

类似的东西StringCases[ToLowerCase[input], WordCharacter..]似乎要快一些。我可能会使用DeleteCases[expr, ""]而不是Cases[expr, Except[""]].

于 2011-10-18T04:03:05.947 回答
10

可以通过将“计数器”操作注入正在匹配的模式中来查看StringSplitand操作的进度。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[""]]

  ]

该技术的关键在于两种情况下使用的模式都与通配符匹配_。但是,该通配符受到一个总是失败的条件的保护——但直到它增加了一个计数器作为副作用。然后将“真实”匹配条件作为替代处理。

于 2011-10-18T13:59:47.987 回答
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 的建议多花一点时间。

于 2011-10-18T13:00:19.333 回答
4

我不知道它是如何Cases工作的,但List处理可能很耗时,特别是如果它正在构建List它。由于处理后的表达式中存在未知数量的术语,因此很可能是Cases. 所以,我会尝试一些稍微不同的东西:将 "" 替换为Sequence[]. 例如,这个List

{"5", "6", "7", Sequence[]}

变成

{"5", "6", "7"}.

所以,试试

bigList /. "" -> Sequence[]

它应该运行得更快,因为它不是List白手起家。

于 2011-10-18T03:20:17.430 回答