免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: wlyqiqi
打印 上一主题 下一主题

[文本处理] awk相关问题 [复制链接]

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
51 [报告]
发表于 2014-04-24 13:47 |只看该作者
本帖最后由 Herowinter 于 2014-04-24 13:49 编辑

回复 48# Herowinter
上午开会,现在写好了,好像我昨天想复杂了。
我刚翻回去看了下你需求,关于002的AP计算你这么描述的。
  1. 002这个query的AP为(1/50)*(1/1+2/2+3/3+4/24)
复制代码
好像不需要计算实际出现的个数4,最后都是除以指定的上限50?
我现在是这么做的。如果要根据实际记录个数而不是统一除以50,
请跟贴,我再修改。结果我没怎么验证,你看一下是不是合理,
我就验证了下002和你上面手算的一样。
  1. awk 'BEGIN{n=50} NR==FNR{a[$1" "$3];c[$1];next} {if(++c[$1]<=n){if(c[$1]==1)sn=0;if($1" "$3 in a){A[$1]++;sn++;APtmp[$1" "sn]=sn/++$4}else B[$1]++;b[$1" "$3]}} END{for(i in a){split(i,key," ");k=key[1];if(!(i in b))C[k]++};for(i in APtmp){split(i,key," ");k=key[1];AP[k]+=APtmp[i]} print "key\t准确率\t召回率\tF1\tAP";for(i in c){P=A[i]/(A[i]+B[i]);R=A[i]/(A[i]+C[i]);F1=(P+R)>0?2*P*R/(P+R):0;APi=AP[i]/n;printf "%s\t%.4f\t%.4f\t%.4f\t%.4f\n",i,P,R,F1,APi}}' training.qrels TF_IDF_0.res|sort -n -k1
  2. key        准确率        召回率        F1        AP
  3. 001        0.0400        1.0000        0.0769        0.0400
  4. 002        0.0800        1.0000        0.1481        0.0633
  5. 003        0.0200        1.0000        0.0392        0.0100
  6. 004        0.0200        0.0588        0.0299        0.0010
  7. 005        0.0600        1.0000        0.1132        0.0150
  8. 006        0.0200        1.0000        0.0392        0.0040
  9. 007        0.0600        1.0000        0.1132        0.0324
  10. 008        0.0800        1.0000        0.1481        0.0689
  11. 009        0.1400        1.0000        0.2456        0.1180
  12. 010        0.1400        1.0000        0.2456        0.0576
  13. 011        0.1000        1.0000        0.1818        0.0299
  14. 012        0.2200        1.0000        0.3607        0.1912
  15. 013        0.1400        1.0000        0.2456        0.1123
  16. 014        0.0400        1.0000        0.0769        0.0400
  17. 015        0.1000        1.0000        0.1818        0.0428
  18. 016        0.1800        1.0000        0.3051        0.1382
  19. 017        0.0800        1.0000        0.1481        0.0800
  20. 018        0.0400        1.0000        0.0769        0.0209
  21. 019        0.0800        1.0000        0.1481        0.0215
  22. 020        0.1400        1.0000        0.2456        0.0601
  23. 021        0.1200        1.0000        0.2143        0.1100
  24. 022        0.0400        1.0000        0.0769        0.0136
  25. 023        0.0200        1.0000        0.0392        0.0067
  26. 024        0.0600        1.0000        0.1132        0.0600
  27. 025        0.1000        1.0000        0.1818        0.0659
  28. 026        0.0600        0.7500        0.1111        0.0268
  29. 027        0.1200        1.0000        0.2143        0.0599
  30. 028        0.0600        0.5000        0.1071        0.0233
  31. 029        0.0000        0.0000        0.0000        0.0000
  32. 030        0.0200        1.0000        0.0392        0.0200
  33. 031        0.2400        1.0000        0.3871        0.1858
  34. 032        0.0200        0.5000        0.0385        0.0050
  35. 033        0.0200        1.0000        0.0392        0.0200
  36. 034        0.0200        1.0000        0.0392        0.0100
  37. 035        0.0400        1.0000        0.0769        0.0400
  38. 036        0.1000        0.8333        0.1786        0.0519
  39. 037        0.1000        1.0000        0.1818        0.0421
  40. 038        0.0200        1.0000        0.0392        0.0200
  41. 039        0.1600        1.0000        0.2759        0.1535
  42. 040        0.1000        1.0000        0.1818        0.0168
  43. 041        0.0200        1.0000        0.0392        0.0050
  44. 042        0.3400        1.0000        0.5075        0.3252
  45. 043        0.0400        1.0000        0.0769        0.0300
  46. 044        0.0400        1.0000        0.0769        0.0244
  47. 045        0.1800        1.0000        0.3051        0.1674
  48. 046        0.0600        1.0000        0.1132        0.0550
  49. 047        0.1000        1.0000        0.1818        0.0500
  50. 048        0.0000        0.0000        0.0000        0.0000
  51. 049        0.1000        1.0000        0.1818        0.0628
  52. 050        0.1200        1.0000        0.2143        0.0986
  53. 051        0.2200        1.0000        0.3607        0.1859
  54. 052        0.0600        1.0000        0.1132        0.0600
  55. 053        0.0600        1.0000        0.1132        0.0287
  56. 054        0.1000        1.0000        0.1818        0.0967
  57. 055        0.1200        1.0000        0.2143        0.0460
  58. 056        0.0600        1.0000        0.1132        0.0283
  59. 057        0.0200        1.0000        0.0392        0.0200
复制代码

论坛徽章:
0
52 [报告]
发表于 2014-04-24 16:05 |只看该作者
回复 51# Herowinter

Sorry,我刚才仔细看了一下,我之前对AP的理解是偏差的,分母不是固定的50,而是要搜索的相关条目的个数。(比如training.qrels里的001的个数)
举个例子,现有一个query,与之相关的文档有4个——D1,D2,D3,D4,用rank方法检索后,D2,D3,D4的排序分别是1,3,5;D1没有搜索到。那么AP = (0 + 1/1 + 2/3 + 3/5)/ 4
   

论坛徽章:
0
53 [报告]
发表于 2014-04-24 16:11 |只看该作者
回复 52# wlyqiqi
还要求precision@10的值,即只看每个query前10个条目的准确率。(只读取TF_IDF_0.res每个query的前10行,前面算的是precision@50)

   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
54 [报告]
发表于 2014-04-24 16:12 |只看该作者
回复 52# wlyqiqi
你确定分母是training.qrels这个文件里001 002对应的记录数目,
这个也不难做啊。


   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
55 [报告]
发表于 2014-04-24 16:14 |只看该作者
回复 53# wlyqiqi
那个我已经做了呀,参数n要50还是10还是其他什么的,
你根据自己需要随便改呀。

论坛徽章:
0
56 [报告]
发表于 2014-04-24 16:18 |只看该作者
回复 55# Herowinter
哦哦,改成n=10就行了、
BEGIN{n=10}
   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
57 [报告]
发表于 2014-04-24 16:20 |只看该作者
回复 52# wlyqiqi
按照你的新描述 002在training文件里有4个记录
AP=(1/4)*(1/1+2/2+3/3+4/24)=0.79166,
希望是最后一发了。
  1. awk 'BEGIN{n=50} NR==FNR{a[$1" "$3];c[$1];count[$1]++;next} {if(++c[$1]<=n){if(c[$1]==1)sn=0;if($1" "$3 in a){A[$1]++;sn++;APtmp[$1" "sn]=sn/++$4}else B[$1]++;b[$1" "$3]}} END{for(i in a){split(i,key," ");k=key[1];if(!(i in b))C[k]++};for(i in APtmp){split(i,key," ");k=key[1];AP[k]+=APtmp[i]} print "key\t准确率\t召回率\tF1\tAP";for(i in c){P=A[i]/(A[i]+B[i]);R=A[i]/(A[i]+C[i]);F1=(P+R)>0?2*P*R/(P+R):0;APi=AP[i]/count[i];printf "%s\t%.4f\t%.4f\t%.4f\t%.4f\n",i,P,R,F1,APi}}' training.qrels TF_IDF_0.res|sort -n -k1
  2. key        准确率        召回率        F1        AP
  3. 001        0.0400        1.0000        0.0769        1.0000
  4. 002        0.0800        1.0000        0.1481        0.7917
  5. 003        0.0200        1.0000        0.0392        0.5000
  6. 004        0.0200        0.0588        0.0299        0.0029
  7. 005        0.0600        1.0000        0.1132        0.2500
  8. 006        0.0200        1.0000        0.0392        0.2000
  9. 007        0.0600        1.0000        0.1132        0.5397
  10. 008        0.0800        1.0000        0.1481        0.8611
  11. 009        0.1400        1.0000        0.2456        0.8425
  12. 010        0.1400        1.0000        0.2456        0.4117
  13. 011        0.1000        1.0000        0.1818        0.2992
  14. 012        0.2200        1.0000        0.3607        0.8691
  15. 013        0.1400        1.0000        0.2456        0.8018
  16. 014        0.0400        1.0000        0.0769        1.0000
  17. 015        0.1000        1.0000        0.1818        0.4283
  18. 016        0.1800        1.0000        0.3051        0.7676
  19. 017        0.0800        1.0000        0.1481        1.0000
  20. 018        0.0400        1.0000        0.0769        0.5217
  21. 019        0.0800        1.0000        0.1481        0.2682
  22. 020        0.1400        1.0000        0.2456        0.4296
  23. 021        0.1200        1.0000        0.2143        0.9167
  24. 022        0.0400        1.0000        0.0769        0.3409
  25. 023        0.0200        1.0000        0.0392        0.3333
  26. 024        0.0600        1.0000        0.1132        1.0000
  27. 025        0.1000        1.0000        0.1818        0.6589
  28. 026        0.0600        0.7500        0.1111        0.3353
  29. 027        0.1200        1.0000        0.2143        0.4994
  30. 028        0.0600        0.5000        0.1071        0.1944
  31. 029        0.0000        0.0000        0.0000        0.0000
  32. 030        0.0200        1.0000        0.0392        1.0000
  33. 031        0.2400        1.0000        0.3871        0.7742
  34. 032        0.0200        0.5000        0.0385        0.1250
  35. 033        0.0200        1.0000        0.0392        1.0000
  36. 034        0.0200        1.0000        0.0392        0.5000
  37. 035        0.0400        1.0000        0.0769        1.0000
  38. 036        0.1000        0.8333        0.1786        0.4327
  39. 037        0.1000        1.0000        0.1818        0.4213
  40. 038        0.0200        1.0000        0.0392        1.0000
  41. 039        0.1600        1.0000        0.2759        0.9594
  42. 040        0.1000        1.0000        0.1818        0.1684
  43. 041        0.0200        1.0000        0.0392        0.2500
  44. 042        0.3400        1.0000        0.5075        0.9566
  45. 043        0.0400        1.0000        0.0769        0.7500
  46. 044        0.0400        1.0000        0.0769        0.6111
  47. 045        0.1800        1.0000        0.3051        0.9301
  48. 046        0.0600        1.0000        0.1132        0.9167
  49. 047        0.1000        1.0000        0.1818        0.5000
  50. 048        0.0000        0.0000        0.0000        0.0000
  51. 049        0.1000        1.0000        0.1818        0.6278
  52. 050        0.1200        1.0000        0.2143        0.8218
  53. 051        0.2200        1.0000        0.3607        0.8450
  54. 052        0.0600        1.0000        0.1132        1.0000
  55. 053        0.0600        1.0000        0.1132        0.4778
  56. 054        0.1000        1.0000        0.1818        0.9667
  57. 055        0.1200        1.0000        0.2143        0.3835
  58. 056        0.0600        1.0000        0.1132        0.4722
  59. 057        0.0200        1.0000        0.0392        1.0000
复制代码

论坛徽章:
0
58 [报告]
发表于 2014-04-24 16:34 |只看该作者
回复 57# Herowinter

我刚才笔算了几个AP,都是正确的,太感谢你了~{:2_168:}

   

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
59 [报告]
发表于 2014-04-25 09:40 |只看该作者
因为需求是一条条提的,代码是在原来代码上拼的,
可能写得有点罗嗦,根本不许要sn那个变量,值已经
存在A[$1]里了,改成这样结果一样的。
  1. awk 'BEGIN{n=50} NR==FNR{a[$1" "$3];c[$1];count[$1]++;next} {if(++c[$1]<=n){if($1" "$3 in a){APtmp[$1" "A[$1]]=++A[$1]/++$4}else B[$1]++;b[$1" "$3]}} END{for(i in a){split(i,key," ");k=key[1];if(!(i in b))C[k]++};for(i in APtmp){split(i,key," ");k=key[1];AP[k]+=APtmp[i]} print "key\t准确率\t召回率\tF1\tAP";for(i in c){P=A[i]/(A[i]+B[i]);R=A[i]/(A[i]+C[i]);F1=(P+R)>0?2*P*R/(P+R):0;APi=AP[i]/count[i];printf "%s\t%.4f\t%.4f\t%.4f\t%.4f\n",i,P,R,F1,APi}}' training.qrels TF_IDF_0.res|sort -n -k1
复制代码

论坛徽章:
0
60 [报告]
发表于 2014-04-25 14:17 |只看该作者
12345678


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP