11

これは明らかな質問のようですが、リストのチュートリアルとドキュメントは近日公開されません。これらの問題の多くは、私のテキストファイルのサイズ(数百MB)と、システムで管理できるものにまとめようとする試みに起因しています。その結果、私はセグメントで作業を行っており、現在、結果を組み合わせようとしています。

私は複数の単語頻度リストを持っています(そのうちの約40)。リストは、Import []を介して取得することも、Mathematicaで生成された変数として取得することもできます。各リストは次のように表示され、Tally[]およびSort[]コマンドを使用して生成されています。

{{"the"、42216}、{"of"、24903}、{"and"、18624}、{"n"、16850}、{"in"、
16164}、{"de"、14930}、{ "a"、14660}、{"to"、14175}、{"la"、7347}、{"was"、6030}、{"l"、5981}、{"le"、5735}、<< 51293 >>、{"食肉処理場"、1}、{"食肉処理場"、1}、{"食肉処理場"、1}、{"食肉処理場"、1}、{"食肉処理場"、1}、{"食肉処理場"、1} 、{"abaiss"、1}、{"aback"、1}、{"aase"、1}、{"aaijaut"、1}、{"aaaah"、1}、{"aaa"、1}}

2番目のファイルの例を次に示します。

{{"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 >>、{"食肉処理"、1}、{"食肉処理"、1}、{"食肉処理"、1}、{"食肉処理"、1}、{"食肉処理"、1}、{"食肉処理"、1} 、{"aback"、1}、{"aase"、1}、{"aaijaut"、1}、{"aaaah"、1}、{"aaa"、1}}

頻度データが集約されるようにそれらを組み合わせたいと思います。つまり、2番目のファイルに30,419回の「the」があり、最初のファイルに結合されている場合、72,635回の出現があることを返す必要があります(コレクション)。

4

5 に答える 5

10

必要なようですねGatherBy

2つのリストに名前が付けられているとdata1data2ます。

{#[[1, 1]], Total[#[[All, 2]]]} & /@ GatherBy[Join[data1, data2], First]

これは、2つだけでなく、任意の数のリストに簡単に一般化できます。

于 2011-10-24T13:57:40.990 に答える
8

このようなハッシュテーブルを使用してみてください。最初に設定します。

ClearAll[freq];
freq[_] = 0;

ここで、たとえば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}};

あなたはこれを実行することができます

Scan[(freq[#[[1]]] += #[[2]]) &, lst1]

その後、例えば

freq["the"]
(*
42216
*)

そして次のリスト

Scan[(freq[#[[1]]] += #[[2]]) &, lst2]

その後、例えば

freq["the"]
72635

まだ

freq["safas"]
(*
0
*)
于 2011-10-24T13:36:51.717 に答える
8

直接Sow/Reap関数は次のとおりです。

Reap[#2~Sow~# & @@@ data1~Join~data2;, _, {#, Tr@#2} &][[2]]

aclのメソッドの簡潔な形式は次のとおりです。

Module[{c},
  c[_] = 0;

  c[#] += #2 & @@@ data1~Join~data2;

  {#[[1, 1]], #2} & @@@ Most@DownValues@c
]

これは、私のシステムのSzabolcsコードよりも少し速いようです。

data1 ~Join~ data2 ~GatherBy~ First /.
  {{{x_, a_}, {x_, b_}} :> {x, a + b}, {x : {_, _}} :> x}
于 2011-10-24T19:06:00.413 に答える
6

「ハンマーだけだと、すべてが釘になる」という古いことわざがあります。だから、これが私のハンマーです:SelectEquivalents

これは、以下を使用して少し速く行うことができますSelectEquivalents

SelectEquivalents[data1~Join~data2, #[[1]]&, #[[2]]&, {#1, Total[#2]}&]

順番に、最初のパラメータは明らかに結合されたリストであり、2番目のパラメータはそれらがグループ化されたもの(この場合は最初の要素)であり、3番目のパラメータは文字列を取り除き、カウントだけを残し、4番目のパラメータはそれを置きます文字列as#1とリスト内のカウントをとして戻し#2ます。

于 2011-10-24T14:52:03.513 に答える
3

試してみてくださいReplaceRepeated

リストに参加します。次に、

//. {{f1___, {a_, c1_}, f2___, {a_, c2_}, f3___} -> {f1, f2, f3, {a, c1 + c2}}}
于 2011-10-24T13:24:19.337 に答える