在Mathematica中搜索术语出现次数

pro*_*ian 6 search text wolfram-mathematica

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

我发现文档WRT FindList,流,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"]
Run Code Online (Sandbox Code Playgroud)

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

rco*_*yer 9

除了丹尼尔的回答之外,你似乎还要求提供一个只出现一次的文件列表.为此,我将继续运行FindList所有文件

res =FindList[filelist, "love"]
Run Code Online (Sandbox Code Playgroud)

然后,通过将结果减少到单行

lines = Select[ res, Length[#]==1& ]
Run Code Online (Sandbox Code Playgroud)

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

Select[ lines, StringCount[ #, RegularExpression[ "\\blove\\b" ] ] == 1& ]
Run Code Online (Sandbox Code Playgroud)

RegularExpression规定,"爱"必须用这个词界碑(独特的字\\b),所以像"可爱"将不包括在内.

编辑:似乎FindList在传递文件列表时返回一个展平列表,因此您无法确定哪个项目与哪个文件一起使用.例如,如果你有3个文件,并且它们分别包含单词"love",0,1和2次,你会得到一个看起来像的列表

{, love, love, love }
Run Code Online (Sandbox Code Playgroud)

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

res = FindList[#, "love"]& /@ filelist
Run Code Online (Sandbox Code Playgroud)

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

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

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

它返回一个表单列表

{ {filename, { "string with love in it" }, 
  {filename, { "string with love in it" }, ...}
Run Code Online (Sandbox Code Playgroud)

要提取文件名,只需键入即可lines[[All, 1]].

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