楼主: nkwilling
5761 12

原创:如何用Hash对象技术创建文本向量空间模型 [推广有奖]

  • 0关注
  • 65粉丝

副教授

23%

还不是VIP/贵宾

-

威望
1
论坛币
3349 个
通用积分
0.0001
学术水平
109 点
热心指数
93 点
信用等级
47 点
经验
10032 点
帖子
322
精华
0
在线时间
596 小时
注册时间
2008-1-9
最后登录
2013-9-4

楼主
nkwilling 发表于 2010-6-14 15:22:59 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
鉴于很多论坛成员已经购买了我的《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的基础知识有了一定了解后,看起来会更有效。
二维码

扫码加我 拉你入群

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

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

关键词:HASH 如何用 Has compress Distinct 模型 空间 文本 向量 HASH

本帖被以下文库推荐

沙发
crackman 发表于 2010-6-14 18:30:58
不错

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

独家之言,仅供参考。

板凳
tiantianfrm 发表于 2010-7-10 15:36:27
楼主原来在卡中心做过事情吧,我刚进去,听说过你

报纸
tiantianfrm 发表于 2010-7-10 15:38:19
姚师兄,我的QQ;913348978,加我好吗,想跟你好好学习

地板
pandasasa 发表于 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;

7
cz851218 发表于 2010-7-11 12:15:10
楼主太厉害了,看半天才看清楚了点!

8
kuhasu 发表于 2011-8-24 12:33:30
新书出了没?

9
happylijun21 在职认证  发表于 2011-8-25 09:53:20
楼主是我同学的领导,哈哈

10
iavjssssmqee 发表于 2011-11-19 23:59:48
请问第二版什么时候能面世啊?期待中.
决定了,心一恒,就不会害怕!!!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 12:21