免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
780
金牛座
日期: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
21 [报告]
发表于 2014-04-23 01:12 |只看该作者
本帖最后由 Herowinter 于 2014-04-23 01:16 编辑

回复 20# wlyqiqi
低版本的awk不支持,其实这个函数不是非常必要,
没这个不能保证001 002..057的显示顺序。

理论上你先用awk计算结果,然后通过管道按第一列
sort应该可以,我明天上班再改一下代码。

论坛徽章:
780
金牛座
日期: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
22 [报告]
发表于 2014-04-23 09:35 |只看该作者
回复 20# wlyqiqi
试试这个。
  1. awk 'NR==FNR{a[$1" "$3];next} {b[$1" "$3]} END{for(i in b){split(i,key," ");k=key[1];if(i in a){A[k]++}else B[k]++};for(i in a){split(i,key," ");k=key[1];if(!(i in b))C[k]++};print "key\t准确率\t召回率";for(i in A){print i"\t"A[i]/(A[i]+B[i])"\t"A[i]/(A[i]+C[i])}}' training.qrels TF_IDF_0.res|sort -n -k1
复制代码

论坛徽章:
0
23 [报告]
发表于 2014-04-23 14:46 |只看该作者
回复 22# Herowinter
我试了你给我的code,出来结果了但是有一些值是缺失的,比如029,048.

如何求F-1=2P*R / (P+R)   
如何求每一个query前十个值的precision?(precision@10,之前的是precision@50,给定的TF_IDF_0.res是固定50个)
还有Average Precision》》》假设有两个查询,查询1有4个相关文档,查询2有5个相关文档。某系统对查询1检索出4个相关文档,其rank分别为          1,2,4,7;对于查询2检索出3个相关文档,其rank分别为1,3,5。

对于查询1,AP平均正确率为1/1+2/2+3/4+4/7)/4=0.83

对于查询2,AP平均正确率为1/1+2/3+3/5)/3=0.75     mean average precision=(0.83+0.75)/2

麻烦你了,感谢!


   

论坛徽章:
0
24 [报告]
发表于 2014-04-23 14:48 |只看该作者
回复 22# Herowinter

我试了你给我的code,出来结果了但是有一些值是缺失的,比如029,048.

如何求F-1=2P*R / (P+R)   
如何求每一个query前十个值的precision?(precision@10,之前的是precision@50,给定的TF_IDF_0.res每个query是固定50个)
还有Average Precision》》》假设有两个查询,查询1有4个相关文档,查询2有5个相关文档。某系统对查询1检索出4个相关文档,其rank分别为          1,2,4,7;对于查询2检索出3个相关文档,其rank分别为1,3,5。

对于查询1,AP平均正确率为1/1+2/2+3/4+4/7)/4=0.83

对于查询2,AP平均正确率为1/1+2/3+3/5)/3=0.75     mean average precision=(0.83+0.75)/2

麻烦你了,感谢!



   

论坛徽章:
0
25 [报告]
发表于 2014-04-23 14:51 |只看该作者
F1=2P*R / (P+R)中的P为准确率,R为召回率
回复 24# wlyqiqi


   

论坛徽章:
0
26 [报告]
发表于 2014-04-23 14:56 |只看该作者
部分数据缺失可能是因为准确度为0,但是也是需要显示的
回复 23# wlyqiqi


   

论坛徽章:
780
金牛座
日期: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
27 [报告]
发表于 2014-04-23 14:59 |只看该作者
回复 24# wlyqiqi
029 048对应的A值为0,准确率召回率都是0,
所以没创建哈希,我改了下,现在可以了。
新需求我再研究下。
  1. awk 'NR==FNR{a[$1" "$3];c[$1];next} {b[$1" "$3]} END{for(i in b){split(i,key," ");k=key[1];if(i in a){A[k]++}else B[k]++};for(i in a){split(i,key," ");k=key[1];if(!(i in b))C[k]++};print "key\t准确率\t召回率";for(i in c){print i"\t"A[i]/(A[i]+B[i])"\t"A[i]/(A[i]+C[i])}}' training.qrels TF_IDF_0.res|sort -n -k1
  2. key        准确率        召回率
  3. 001        0.04        1
  4. 002        0.08        1
  5. 003        0.02        1
  6. 004        0.02        0.0588235
  7. 005        0.06        1
  8. 006        0.02        1
  9. 007        0.06        1
  10. 008        0.08        1
  11. 009        0.14        1
  12. 010        0.14        1
  13. 011        0.1        1
  14. 012        0.22        1
  15. 013        0.14        1
  16. 014        0.04        1
  17. 015        0.1        1
  18. 016        0.18        1
  19. 017        0.08        1
  20. 018        0.04        1
  21. 019        0.08        1
  22. 020        0.14        1
  23. 021        0.12        1
  24. 022        0.04        1
  25. 023        0.02        1
  26. 024        0.06        1
  27. 025        0.1        1
  28. 026        0.06        0.75
  29. 027        0.12        1
  30. 028        0.06        0.5
  31. 029        0        0
  32. 030        0.02        1
  33. 031        0.24        1
  34. 032        0.02        0.5
  35. 033        0.02        1
  36. 034        0.02        1
  37. 035        0.04        1
  38. 036        0.1        0.833333
  39. 037        0.1        1
  40. 038        0.02        1
  41. 039        0.16        1
  42. 040        0.1        1
  43. 041        0.02        1
  44. 042        0.34        1
  45. 043        0.04        1
  46. 044        0.04        1
  47. 045        0.18        1
  48. 046        0.06        1
  49. 047        0.1        1
  50. 048        0        0
  51. 049        0.1        1
  52. 050        0.12        1
  53. 051        0.22        1
  54. 052        0.06        1
  55. 053        0.06        1
  56. 054        0.1        1
  57. 055        0.12        1
  58. 056        0.06        1
  59. 057        0.02        1
复制代码

论坛徽章:
780
金牛座
日期: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
28 [报告]
发表于 2014-04-23 15:08 |只看该作者
本帖最后由 Herowinter 于 2014-04-23 15:16 编辑

回复 25# wlyqiqi

新需求没怎么看懂,麻烦解释下,最好
不要有太复杂的统计计算,Shell不擅长做这个。
   

论坛徽章:
0
29 [报告]
发表于 2014-04-23 15:47 |只看该作者
回复 28# Herowinter
1. P是准确率,R是召回率
2. Precision@10的意思是我们要重新求前每个query前10个搜索结果的准确率(例如001中前10个值的准确率,这次不是看全部的001),TF_IDF_0.res是得到的搜索结果,training.qrels是期望的查询结果.
3. 对一个有序的列表,计算AP的时候要先求出每个位置上的准确率,然后对所有的位置的准确率再做个平均。如果该位置的文档是不相关的则该位置 准确率=0.   比如002中的匹配值(例如training.qrels中的002 0 352062 1在TF_IDF_0.res中的Rank为24,这个24是在002这个query出现的位置,002 0 352062 1 又是002的正确结果第4个出现的,所以此值在这个位置上的准确率为4/24,002 0 172248 1 为2/2(第2个出现的查询结果,且在002中位置为2 , 所以002这个query的AP为(1/50)*(1/1+2/2+3/3+4/24)  

论坛徽章:
780
金牛座
日期: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
30 [报告]
发表于 2014-04-23 16:02 |只看该作者
回复 29# wlyqiqi
前两条看懂了,第3条,这是你TF_IDF0.res文本中的一段
  1. 002 Q0 120447 0 11.284818180104196 TF_IDF
  2. 002 Q0 172248 1 11.241745855896292 TF_IDF
  3. 002 Q0 89349 2 11.046045877882523 TF_IDF
  4. 002 Q0 331951 3 10.69009657042346 TF_IDF
  5. 002 Q0 101708 4 10.472860310545578 TF_IDF
  6. 002 Q0 170192 5 10.431219159109279 TF_IDF
  7. 002 Q0 100327 6 10.12265106183553 TF_IDF
  8. 002 Q0 93037 7 9.91595590137827 TF_IDF
  9. 002 Q0 138520 8 9.882332366195334 TF_IDF
  10. 002 Q0 492792 9 9.668581706130551 TF_IDF
  11. 002 Q0 354 10 9.616501745100743 TF_IDF
  12. 002 Q0 61239 11 9.07705817625381 TF_IDF
  13. 002 Q0 469477 12 8.964356207586881 TF_IDF
  14. 002 Q0 95280 13 8.916770949208495 TF_IDF
  15. 002 Q0 180123 14 8.901025772351623 TF_IDF
  16. 002 Q0 213721 15 8.729628664048981 TF_IDF
  17. 002 Q0 47727 16 8.670009483229467 TF_IDF
  18. 002 Q0 88125 17 8.62236292708031 TF_IDF
  19. 002 Q0 516950 18 8.617906149795504 TF_IDF
  20. 002 Q0 255269 19 8.613105248860307 TF_IDF
  21. 002 Q0 159480 20 8.598975231092005 TF_IDF
  22. 002 Q0 453009 21 8.500433061654924 TF_IDF
  23. 002 Q0 124243 22 8.491115807382815 TF_IDF
  24. 002 Q0 352062 23 8.489990334374218 TF_IDF
复制代码
下标是从0开始的
002 352062你所说的24就是这里的$4=23+1?
还有那个4,什么叫第4个正确的结果,我没看出
这个值怎么得出来的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP