【问题标题】:Searching for Number of Term Appearances in Mathematica在 Mathematica 中搜索项出现的次数
【发布时间】:2011-09-22 14:28:17
【问题描述】:

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

【问题讨论】:

  • 不要忘记为有帮助的答案投票(当您获得 15 名声望时),如果有人回答了您的问题,请将其标记为已接受。
  • 感谢您的提醒,rcollyer(总是很高兴了解社区标准)。在我实施这些建议时,我可能需要一些时间来完全解决这个问题,但如果我有代表,我肯定会支持这些。
  • 查看FAQ 以获得对标准的全面解释。
  • @ian 对您的用户 ID 稍作更改可能会很好:避免以“i”开头,因为大写会将其变为“I”,这无法与小写“L”区分开来,并且您会错过 cmets
  • @belisarius 很棒的电话,我已经更改了我的用户名。

标签: search text wolfram-mathematica


【解决方案1】:

除了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 个文件,并且它们分别包含 0、1 和 2 次“love”一词,您会得到一个看起来像的列表

{, 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 ([[ ]]) 指定每个数据中的第二个元素,提取文件名也是如此。

【讨论】:

  • 也非常感谢,这很有帮助。我会继续修改它,这有助于通过分析行级别来打开一些关于处理数据的进一步想法。
  • @Ian,belisarius 注意到FindList 中的一个缺陷,所以我添加了一个解决方法,除了修复我之前代码中的一个小错误。
  • 太好了,我正在尝试 - 非常感谢您的慷慨帮助!
  • 它似乎正在工作。上面的 Map(/@) 命令是关键的补充!这些都是很棒的东西,我会在进行文本处理时作为参考。
【解决方案2】:

帮助 > 文档中心 > FindList item 4:

"查找列表[文件,文本,n] 仅包含找到的前 n 行。”

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

丹尼尔·利希特布劳

【讨论】:

  • @Daniel 它无法识别单词在哪些文件中只出现一次,是吗?
  • @belisarius,更糟糕的是,它似乎将列表完全展平,因此您无法确定哪个是哪个。
  • @belisarius 不,不提供文件。但该数据不在请求中,只是一个长度。
  • @Daniel 对不起,也许我误解了这个问题
  • @belisarius 我认为它(问题)正在演变。这很好——在响应提供洞察力时进行一些改进通常是一件好事。
猜你喜欢
  • 2021-06-11
  • 1970-01-01
  • 2012-02-16
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
相关资源
最近更新 更多