gpt4 book ai didi

search - 在Mathematica中搜索词条出现次数

转载 作者:行者123 更新时间:2023-12-04 13:34:24 25 4
gpt4 key购买 nike

我试图在Mathematica 8(12k +)中搜索大量文本文件。到目前为止,我已经能够绘制出单词出现的绝对次数(即,“爱”一词在这12k文件中出现了5,000次)。但是,我很难确定“爱”出现一次的文件数量-可能只有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"]

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

最佳答案

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

res =FindList[filelist, "love"]

然后,通过将结果减少到仅一行
lines = Select[ res, Length[#]==1& ]

但是,这并不能消除单行中出现多个事件的情况。为此,您可以使用 StringCount 并仅接受其值为1的实例,如下所示
Select[ lines, StringCount[ #, RegularExpression[ "\\blove\\b" ] ] == 1& ]

RegularExpression 使用单词边界标记( \\b)指定“love”必须是一个不同的单词,这样就不会包含“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( [[ ]] )指定每个数据中的第二个元素,提取文件名也是如此。

关于search - 在Mathematica中搜索词条出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7516469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com