【问题标题】:Mathematica - Exclude a String from a String SearchMathematica - 从字符串搜索中排除字符串
【发布时间】:2011-07-06 22:00:55
【问题描述】:

我正在尝试选择表格中出现频率最高的关键词。 我需要在列表中搜索不包含给定的第二个、第三个、第四个等单词的单词的出现次数。

例如,我需要搜索“棒棒糖”一词出现在不包含“糖果”一词的列表中的次数。

此代码将返回单词“lollypop”出现的次数:

rt = Parallelize@
 Cases[MemoizeTable["Candy_table.txt"], 
  x_List /; 
   MemberQ[x, 
    s_String /; 
     StringMatchQ[s, ("*lollypop*"), IgnoreCase -> True]], {1}];

我尝试添加StringFreeQ 以排除“糖果”,并尝试添加Nor,其中有人会在字符串搜索中添加Or,但我不知道该怎么做/放在哪里/他们..?

基本上,我需要一个"this" BUT NOT "that" 代码。

【问题讨论】:

  • 什么是MemoizeTable?这是mm8中的一个新功能,还是你写的?它有什么作用?

标签: pattern-matching wolfram-mathematica string-matching


【解决方案1】:
excludeList = {"candy", "other"};
toCount = "lollypop";

numberOfToCount[list_, tocount_, excludeList_] := 
  If[And @@ ((! MemberQ[list, #]) & /@ excludeList), 
     Count[list, tocount], 
     "Excluded"];

用法:

numberOfToCount[{"lollypop", "lollypop", "the beatles"}, toCount, excludeList]
numberOfToCount[{"lollypop", "lollypop", "candy"}, toCount, excludeList]

(*
-> 2
-> Excluded
*)

【讨论】:

  • +1。我建议将And @@ ((! MemberQ[list, #]) & /@ excludeList) 更改为! MemberQ[list, Alternatives @@ excludeList] - 这会更有效(我在这里考虑过类似的问题:mathprogramming-intro.org/book/node472.html,其中还讨论了发布的效率)。对于很长的排除词列表,就速度而言,这个Intersection[list, excludeList] === {} 将比上述任何一个都好。
【解决方案2】:

要获取单词,请尝试例如

dl = DictionaryLookup[];

Select[dl, 
 StringFreeQ[#, ___ ~~ "ies" ~~ ___] && 
 StringMatchQ[#, ___ ~~ "loll" ~~ ___] &]
 (*
 -> {"loll", "lolled", "lolling", "lollipop", "lollipops", "lollop", "lolloped", "lolloping", "lollops", "lolls", "lolly"}
 *)

您可以通过在末尾添加//Count 来计算它们(比如说)。

编辑:看来我误解了你的问题。如果您要问的是:计算“canapes”出现在列表中的次数,该列表不包括“modifiable”,那么:

dl2 = {"titivation", "curving", "doppelgangers", "objurgations", 
"canapes", "invaluable", "modifiable", "dissect", "ominousness", 
"sentinel"}

If[Not@MemberQ[dl2, "modifiable"], Count[dl2, "canapes"], False]
(*
-> False
*)

同时

If[Not@MemberQ[dl2, "plate"], Count[dl2, "canapes"], False]

不包括“盘子”,因此此列表为 1。

但是我对您的 cmets 感到困惑(“此代码正在返回我正在运行其他搜索的列表的初步选择,所以我需要保持列表完整”哪个列表?它们都由上面的代码)所以我一定还是遗漏了一些东西。

【讨论】:

  • 有没有办法将它合并到我已经拥有的代码中,我不返回单词,而是包含单词的整个列表?在MemberQ 括号内的某处?
  • 此代码返回我正在运行其他搜索的列表的初步选择,因此我需要保持列表完整。
  • @acl 重新编辑。我知道 OP 希望根据一个 list 术语来排除,而不仅仅是一个(在您的示例中为“盘子”)。或者我的答案可能比它应该的更复杂
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
相关资源
最近更新 更多