在Mathematica中搜索术语出现次数

时间:2011-09-22 14:28:18

标签: search text wolfram-mathematica

我正在尝试在Mathematica 8(12k +)中搜索大量文本文件。到目前为止,我已经能够绘制一个单词出现的绝对次数(即“爱”这个单词在这些12k文件中出现5000次)。但是,我很难确定“爱”出现一次的文件数量 - 这可能只有1,000个文件,而在其他文件中重复几次。

我发现文档WRT FindList,streams,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"]

非常感谢。这是我的第一篇文章,我主要通过同行/监督帮助,在线教程和文档来学习Mathematica。

2 个答案:

答案 0 :(得分:9)

除了Daniel's answer之外,您似乎还要求提供仅出现一次的文件列表。为此,我将继续在所有文件中运行FindList

res =FindList[filelist, "love"]

然后,通过

将结果减少到单行
lines = Select[ res, Length[#]==1& ]

但是,这并不能消除单行中出现多次的情况。为此,您可以使用StringCount并仅接受其为1的实例,如下所示

Select[ lines, StringCount[ #, RegularExpression[ "\\blove\\b" ] ] == 1& ]

RegularExpression指定“love”必须是使用单词边界标记(\\b)的独特单词,因此不会包含像“lovely”这样的单词。

修改:传递文件列表时显示FindList会返回展平列表,因此您无法确定哪个项目与哪个文件相关。例如,如果您有3个文件,并且它们分别包含单词“love”,0,1和2次,您将获得一个类似于

的列表
{, love, love, love }

显然没用。要解决此问题,您必须单独处理每个文件,最好通过Map/@)完成,如下所示

res = FindList[#, "love"]& /@ filelist

以上代码的其余部分按预期工作。

但是,如果要将结果与文件名关联,则必须稍微更改一下。

res = {#, FindList[#, "love"]}& /@ filelist
lines = Select[res, 
         Length[ #[[2]] ] ==1 &&  (* <-- Note the use of [[2]] *)
         StringCount[ #[[2]], RegularExpression[ "\\blove\\b" ] ] == 1&
        ]

返回表单列表

{ {filename, { "string with love in it" }, 
  {filename, { "string with love in it" }, ...}

要提取文件名,只需输入lines[[All, 1]]

注意,为了Select所需的属性,我使用Part[[ ]])来指定每个数据中的第二个元素,同样用于提取文件名。

答案 1 :(得分:4)

帮助&gt;文档中心&gt; FindList项目4:

“FindList [文件,文本,n]的 仅包括前n行。“

所以你可以将n设置为1。

Daniel Lichtblau