pro*_*ian 11 wolfram-mathematica word-frequency
这似乎应该是一个显而易见的问题,但列表上的教程和文档不会出现.其中许多问题源于我的文本文件的大小(数百MB)以及我试图将它们归结为我的系统可管理的东西.结果,我正在分段工作,现在正试图将结果结合起来.
我有多个单词频率列表(约40个).列表可以通过Import []获取,也可以作为Mathematica中生成的变量获取.每个列表显示如下,并使用Tally []和Sort []命令生成:
{{"the",42216},{"of",24903},{"和",18624},{"n",16850},{"in",
16164},{"de",14930},{ "a",14660},{"to",14175},{"la",7347},{"was",6030},{"l",5981},{"le",5735},<< 51293 >>,{"abattoir",1},{"abattement",1},{"abattagen",1},{"abattage",1},{"abated",1},{"abandonn",1} ,{"abaiss",1},{"aback",1},{"aase",1},{"aaijaut",1},{"aaaah",1},{"aaa",1}}
以下是第二个文件的示例:
{{"the",30419},{"n",20414},{"de",19956},{"of",16262},{"and",
14488},{"to",12726},{ "a",12635},{"in",11141},{"la",10739},{"et",9016},{"les",8675},{"le",7748},<< 101032 >>,{"abattement",1},{"abattagen",1},{"abattage",1},{"abated",1},{"abandonn",1},{"abaiss",1} ,{"aback",1},{"aase",1},{"aaijaut",1},{"aaaah",1},{"aaa",1}}
我想将它们组合起来,以便频率数据聚合:即如果第二个文件有30,419次出现''并且加入第一个文件,它应该返回有72,635次出现(依此类推,因为我在整个文件中移动)采集).
Sza*_*lcs 10
这听起来像你需要的GatherBy.
假设你的两个列表被命名为data1和data2,然后用
{#[[1, 1]], Total[#[[All, 2]]]} & /@ GatherBy[Join[data1, data2], First]
Run Code Online (Sandbox Code Playgroud)
这很容易推广到任意数量的列表,而不仅仅是两个.
尝试使用哈希表,像这样.首先要做的事情:
ClearAll[freq];
freq[_] = 0;
Run Code Online (Sandbox Code Playgroud)
现在例如freq["safas"]返回0.接下来,如果列表被定义为
lst1 = {{"the", 42216}, {"of", 24903}, {"and", 18624}, {"n",
16850}, {"in", 16164}, {"de", 14930}, {"a", 14660}, {"to",
14175}, {"la", 7347}, {"was", 6030}, {"l", 5981}, {"le",
5735}, {"abattoir", 1}, {"abattement", 1}, {"abattagen",
1}, {"abattage", 1}, {"abated", 1}, {"abandonn", 1}, {"abaiss",
1}, {"aback", 1}, {"aase", 1}, {"aaijaut", 1}, {"aaaah",
1}, {"aaa", 1}};
lst2 = {{"the", 30419}, {"n", 20414}, {"de", 19956}, {"of",
16262}, {"and", 14488}, {"to", 12726}, {"a", 12635}, {"in",
11141}, {"la", 10739}, {"et", 9016}, {"les", 8675}, {"le",
7748}, {"abattement", 1}, {"abattagen", 1}, {"abattage",
1}, {"abated", 1}, {"abandonn", 1}, {"abaiss", 1}, {"aback",
1}, {"aase", 1}, {"aaijaut", 1}, {"aaaah", 1}, {"aaa", 1}};
Run Code Online (Sandbox Code Playgroud)
你可以运行这个
Scan[(freq[#[[1]]] += #[[2]]) &, lst1]
Run Code Online (Sandbox Code Playgroud)
之后,例如
freq["the"]
(*
42216
*)
Run Code Online (Sandbox Code Playgroud)
然后是下一个清单
Scan[(freq[#[[1]]] += #[[2]]) &, lst2]
Run Code Online (Sandbox Code Playgroud)
之后,例如
freq["the"]
72635
Run Code Online (Sandbox Code Playgroud)
同时还
freq["safas"]
(*
0
*)
Run Code Online (Sandbox Code Playgroud)
这是直接Sow/ Reap功能:
Reap[#2~Sow~# & @@@ data1~Join~data2;, _, {#, Tr@#2} &][[2]]
Run Code Online (Sandbox Code Playgroud)
这是acl方法的简明形式:
Module[{c},
c[_] = 0;
c[#] += #2 & @@@ data1~Join~data2;
{#[[1, 1]], #2} & @@@ Most@DownValues@c
]
Run Code Online (Sandbox Code Playgroud)
这看起来比我系统上的Szabolcs代码快一点:
data1 ~Join~ data2 ~GatherBy~ First /.
{{{x_, a_}, {x_, b_}} :> {x, a + b}, {x : {_, _}} :> x}
Run Code Online (Sandbox Code Playgroud)
有一句古老的谚语说,"如果你拥有的只是一把锤子,那么一切都成了钉子." 所以,这是我的锤子:SelectEquivalents.
这可以使用SelectEquivalents以下方法更快地完成:
SelectEquivalents[data1~Join~data2, #[[1]]&, #[[2]]&, {#1, Total[#2]}&]
Run Code Online (Sandbox Code Playgroud)
按顺序,第一个参数显然只是连接列表,第二个是它们被分组的(在这种情况下是第一个元素),第三个参数剥离字符串而只留下计数,第四个参数放置它返回与字符串as #1和列表中的计数一样#2.