Text 基于大量信息的病例监测过程
我目前正在对一个非常大的文本体(一个文件中约290MB的纯文本)执行操作。在将其导入Mathematica 8之后,我目前正在开始将其分解为小写单词等操作,以便开始文本分析 问题是这些过程需要很长时间。有没有办法通过Mathematica监控这些操作?对于带有变量的操作,我使用了ProgressIndicator等,但这是不同的。我对文档和StackOverflow的搜索没有发现任何类似的结果 在下面,我希望监视Cases[]命令的过程: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
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]
提供了更快的速度和更短的代码。@现在我明白你的意思了。有趣。另一种有趣的方法,应用广泛。我也将实现它,并监控它的相对速度。