Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Text 基于大量信息的病例监测过程_Text_Wolfram Mathematica_Monitoring_Mathematica 8 - Fatal编程技术网

Text 基于大量信息的病例监测过程

Text 基于大量信息的病例监测过程,text,wolfram-mathematica,monitoring,mathematica-8,Text,Wolfram Mathematica,Monitoring,Mathematica 8,我目前正在对一个非常大的文本体(一个文件中约290MB的纯文本)执行操作。在将其导入Mathematica 8之后,我目前正在开始将其分解为小写单词等操作,以便开始文本分析 问题是这些过程需要很长时间。有没有办法通过Mathematica监控这些操作?对于带有变量的操作,我使用了ProgressIndicator等,但这是不同的。我对文档和StackOverflow的搜索没有发现任何类似的结果 在下面,我希望监视Cases[]命令的过程: input=Import["/users/USER/al

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

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

在下面,我希望监视Cases[]命令的过程:

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

我不知道
案例
是如何工作的,但是
列表
处理可能会很耗时,特别是如果它正在构建
列表
。由于处理后的表达式中存在数量未知的术语,因此很可能是
案例中出现的情况。因此,我会尝试一些稍有不同的方法:将“”替换为
Sequence[]
。例如,此
列表

{“5”、“6”、“7”,序列[]
变成

{“5”、“6”、“7”}。
所以,试试看

bigList/。“”->序列[]

它应该运行得更快,因为它不会从无到有地构建一个大的
列表。

类似于
StringCases[ToLowerCase[input],WordCharacter..]
的东西似乎要快一点。我可能会使用
DeleteCases[expr,“]
而不是
Cases[expr,除了[”“]]

这有点取决于文本的外观,但您可以尝试将文本拆分为块并在这些块上迭代。然后可以使用
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"]] 

在一个大约3MB的文件上,这只比Joshua的建议花费了略多的时间。

通过在匹配的模式中注入“计数器”操作,可以查看
StringSplit
案例
操作的进度。以下代码临时显示两个进度条:第一个显示由
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[""]]

  ]

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

这是一个很好的建议-我将尝试实施它。代码效率是这里的根本问题@rcollyer我不担心内部列表的生成发生在
案例中。它当然是为列表构建而优化的,并且不存在
AppendTo
综合症(二次列表构建复杂性)。事实上,它比使用
Sequence
@Leonid的方法效率更高,我过去在使用内置函数时遇到过问题,通常涉及列表生成。(不幸的是,我没有想到具体的例子。)而且,我承认,我没有测试这个。我只是提供了一个可能的替代方案。@ian.milligan真正的效率提升可能在于“尽可能长时间”避免使用Mathematica的模式进行文本操作,而是使用字符串模式、正则表达式、,等等。请记住,许多字符串处理函数,如
StringCases
,也可以处理字符串列表,而且速度非常快。@rcollyer当然,替代方法总是很好的。我只是想指出,
案例
没有这种特殊的缺陷。我想知道你的问题是关于监控
案例【】
的进展,还是关于优化你的代码。他们是两个problems@belisarius几乎,但不是全部。。我从回答中收集到,我需要/请求监控
案例[]
源于代码中一些较慢的选择。另外,也许没有明显的方法来监控这样的进度..+1请注意,在我的机器中,这比相同的未监控代码慢7倍非常聪明+1.除了[WordCharacter]/,您只需使用
;(++charCount;True)
除了[“”]/;(++wordCount;True)
而不是
(++charCount;False))|除了[WordCharacter]
(++wordCount;False))|除了[“”]
,同样成功,但效率更高。使用
DeleteCases
而不是
Cases
可能会比Joshua Martell更快。@Alexey这是我一开始尝试的,但它并没有计算所有字符和单词,只计算那些与模式匹配的字符和单词。另外:使用
/;NumberQ[++charCount]
/;NumberQ[++wordCount]
提供了更快的速度和更短的代码。@现在我明白你的意思了。有趣。另一种有趣的方法,应用广泛。我也将实现它,并监控它的相对速度。