Search 在Mathematica中搜索术语出现次数

Search 在Mathematica中搜索术语出现次数,search,text,wolfram-mathematica,Search,Text,Wolfram Mathematica,我试图在Mathematica 8(12k+)中搜索大量文本文件。到目前为止,我已经能够描绘出一个单词出现的绝对次数(即“爱”这个词在那些12k文件中出现了5000次)。然而,我很难确定“爱”出现过一次的文件的数量——可能只有1000个文件中出现过“爱”,而在其他文件中重复出现过几次 我发现wrtfindlist、streams、recordseparator等文档有点模糊。有没有一种方法可以将其设置为在文件中查找一次术语的关联,然后再移动到下一个 文件列表示例: {“89001.txt”、“8

我试图在Mathematica 8(12k+)中搜索大量文本文件。到目前为止,我已经能够描绘出一个单词出现的绝对次数(即“爱”这个词在那些12k文件中出现了5000次)。然而,我很难确定“爱”出现过一次的文件的数量——可能只有1000个文件中出现过“爱”,而在其他文件中重复出现过几次

我发现wrtfindlist、streams、recordseparator等文档有点模糊。有没有一种方法可以将其设置为在文件中查找一次术语的关联,然后再移动到下一个

文件列表示例:

{“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。

帮助>文档中心>FindList第4项:

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

所以你可以把n设为1

Daniel Lichtblau

除此之外,您似乎还要求提供该单词只出现一次的文件列表。为此,我将继续在所有文件中运行
FindList

res =FindList[filelist, "love"]
然后,通过

lines = Select[ res, Length[#]==1& ]
但是,这并不能消除一行中出现多个事件的情况。要做到这一点,您可以使用并且只接受它为1的实例,如下所示

Select[ lines, StringCount[ #, RegularExpression[ "\\blove\\b" ] ] == 1& ]
res = FindList[#, "love"]& /@ filelist
指定“love”必须是一个使用单词边界标记(
\\b
)的不同单词,这样“love”之类的单词就不会包括在内

编辑:当传递文件列表时,
FindList
似乎会返回一个展开的列表,因此您无法确定哪个项目与哪个文件匹配。例如,如果您有3个文件,并且它们分别包含单词“love”、0、1和2次,那么您将得到一个如下所示的列表

{, love, love, love }
这显然是没有用的。要克服这个问题,您必须单独处理每个文件,最好通过
Map
()来完成,如下所示

Select[ lines, StringCount[ #, RegularExpression[ "\\blove\\b" ] ] == 1& ]
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&
        ]
要提取文件名,只需键入
行[[All,1]]


注意,为了
选择所需的属性,我使用
部分
()指定每个数据中的第二个元素,提取文件名也是如此。

非常感谢,这很有帮助。我会继续修补它,这有助于通过分析行级别来打开一些关于处理数据的进一步想法。@Ian,belisarius注意到
FindList
中存在一个缺陷,因此除了修复以前代码中的一个小错误外,我还添加了一个解决方法。太好了,我现在正在尝试-非常感谢您的慷慨帮助!它似乎起作用了。上面的Map(/@)命令是关键的添加!这些都是很棒的东西,我会在我继续进行文本处理时作为参考。别忘了更新有用的答案(当你获得15个声誉时),如果有人回答了你的问题,请将其标记为已接受。谢谢你的提醒,rcollyer(总是很好地了解社区标准)。在我实施这些建议时,我可能需要一些时间来完全解决这个问题,但如果我有代表的话,我肯定会对这些问题进行投票。请查看以获得对标准的全面解释。@ian对您的用户ID进行一个小的更改可能会很好:避免以“I”开头,因为大写字母会将其变为“I”,这是无法区分的小写字母“L”,你会错过comments@belisarius很棒的呼叫,我已经更改了用户名。@丹尼尔,它不能识别单词只在哪些文件中出现过一次,是吗?@belisarius,更糟糕的是,它似乎完全压平了列表,所以你无法确定哪个是哪个。@belisarius不,不提供文件。但该数据不在请求中,只是长度。@Daniel抱歉,也许我误解了question@belisarius我认为这(问题)正在演变。这很好——当回答提供洞察时,稍微细化一下通常是一件好事。