全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
5671 12
2010-06-14
鉴于很多论坛成员已经购买了我的《SAS编程与数据挖掘商业案例》一书,有些读者对书中提到的Hash技术很感兴趣,在该书中,只有大约3个商业实践的案例。最近我刚好完成了一个涉及到文本聚类的项目,其中用到了Hash,在此以飨读者,更多的文本聚类的代码我会在《SAS编程与数据挖掘商业案例》一书第二版提供给读者。

需求:假设有两个关键字'c b b a'和'w w a'(已经经过数据清洗),显然,该关键字有四个distinct的token,它们是:w;a;b;c。要求生成如下的向量空间模型:

kw            w    c        b        a
c b b a     0     1        2         1
w w a       2     0        0         1
.
显然,有很多种方法可以实现,我在此提供一种通过Hash技术来实现的方法:


data test;
kw='c b b a';
output;
kw='w w a';
output;
run;
data hash;
input token_list $ @@;
cards;
w c b a
;
run;

data output;
    If 0 Then Set hash;
    If _N_=1 Then Do;
     Declare Hash Share(Dataset:"hash",ordered: 'yes');
  declare hiter iter("Share");
     Share.Definekey ('token_list');
     Share.Definedata('token_list');
     Share.Definedone();
    End;
set test;
length ar1-ar4 3;
array ar[1:4]   ;
   length first_token_main1  last_token_main1
   first_token_hash1  last_token_hash1 main_word1 hash_word1 $10;
    first_token_main1=upcase(compress(scan(kw,1,' ')));
last_token_main1=upcase(compress(scan(kw,count(trim(kw)," ")+1,' ')));
rc=iter.first();
iter_cnt=0;
DO WHILE (rc=0);
match_count=0;

first_token_hash1=upcase(compress(scan(token_list,1,' ')));
last_token_hash1=upcase(compress(scan(token_list,count(trim(token_list)," ")+1,' ')));
IF (last_token_main1 gt first_token_hash1 or last_token_hash1 gt first_token_main1) THEN DO;
    iter_cnt+1; ar(iter_cnt)=0;go to next;
    END;
m=1;
Do While (compress(scan(kw,m,' ')) ne '');
main_word1=upcase(compress(scan(kw,m,' ')));
n=1;
do while (compress(scan(token_list,n,' ')) ne '');
hash_word1=upcase(compress(scan(token_list,n,' ')));
if (main_word1 gt first_token_hash1) then do;leave;end;
if (main_word1 gt hash_word1) then do;leave;end;
if (main_word1 eq hash_word1) then do;match_count+1;leave;end;
n+1;
end;
m+1;
End;
iter_cnt+1;
ar(iter_cnt)=match_count;
next:rc = iter.next();
    END;
keep kw ar1-ar4;
run;

注意:对上面这段代码需要读者有一定的SAS基础,并已经对我《SAS编程与数据挖掘商业案例》书中提到的Hash的基础知识有了一定了解后,看起来会更有效。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-6-14 18:30:58
不错
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-6-15 10:59:45
这么快就要出第二版了?不建议用第二版的形式更新。可以用与第一部由关系,但内容递进的方式出第二部。和第一部由衔接,但不要有太多的交叉和重复。

独家之言,仅供参考。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-7-10 15:36:27
楼主原来在卡中心做过事情吧,我刚进去,听说过你
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-7-10 15:38:19
姚师兄,我的QQ;913348978,加我好吗,想跟你好好学习
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-7-10 21:54:42
匹配问题,
option fullstimer;
data test;
kw='ac b b a ac acd';
output;
kw='w w a';
output;
run;
data hash;
input token_list $ @@;
cards;
w c b a ac acd
;
run;
data test;
set test;
retain flag 0;
run;
data hash;
set hash;
len=klength(token_list);
run;
data test1(keep=kw j c token_list);
  if 0 then set test hash;
  if _n_=1 then do;
   declare hash myhash(dataset:"hash",ordered:'a');
   myhash.definekey('token_list');
   myhash.definedata('token_list','len');
   myhash.definedone();
   declare hiter myhiter('myhash');
  end;
  set test;
  if flag=0 then do;
   rc=myhiter.first();
   do until(rc^=0);
   if indexw(kw||'',strip(token_list)) then do;flag=1;
   j=0;
    do until(j=0);  
          j=find(kw||'',strip(token_list)||'',j+1);  
           if j=0 then put +3 "That's all";  
          else do;     
            c=ksubstr(kw,j,len);output;
             end;
         end;
      end;
               
    rc=myhiter.next();
   end;
   
  end;
  drop  rc;
run;
data _null_;
     if _n_=1 then do;
     declare hash h();
       h.definekey('kw','c');
       h.definedata('kw','c','sum','token_list');
       h.definedone();
     end;  
         set test1 end=last;
             if h.find()^=0 then do;
                 sum=1;
                 h.add();
           end;
       else  do;
             sum+1;
             h.replace();
       end;
           if last then
                 h.output(dataset:'hash_tag');
       run;
proc sort data=hash_tag;
    by kw;
run;
option missing=0;
proc transpose data=hash_tag
                 out=stat_report(drop=_NAME_);
     ;
   
var sum;
id token_list;
by kw;
run;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群