免费注册 查看新帖 |

Chinaunix

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

【问题】对N个相似文本进行计算分析?5000积分求解决~ [复制链接]

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
1 [报告]
发表于 2014-08-11 16:01 |显示全部楼层
本帖最后由 pitonas 于 2014-08-16 05:32 编辑

这个问题, 我不放弃 ~ {:2_172:}
基本完成
~ {:2_168:}
  • 使用猫 (cat)
  • 我不知道 flag 这个计算规则,所以我用我的规则
  • 在第 40 行有一个错误
  1. #!/usr/bin/perl -w
  2. use 5.010;

  3. my @txt = qw/1.txt 2.txt/;          # glob or ...
  4. my @tmp = map { "$_.tmp" } @txt;    # tmp files
  5. my ( $fh, @fh ) = map { open my $f, '<', $_; $f } @txt;
  6. my @write_fh    = map { open my $f, '>', $_; $f } @tmp;
  7. my ( $CHR, $BEGIN );

  8. while (<$fh>) {
  9.     ( $CHR, $BEGIN ) = (split)[ 3, 4 ];
  10.     my @pos   = [ split /\s/, <$fh> ];
  11.     my $index = $#{ $pos[0] };

  12.     for my $f (@fh) {
  13.         readline $f;
  14.         push @pos, [ split /\s/, <$f> ];
  15.     }

  16.     my @ave = map {
  17.         my ( $i, $sum ) = $_;
  18.         $sum += $pos[$_][$i] for 0 .. $#pos;
  19.         $sum / @pos;
  20.     } 0 .. $#{ $pos[0] };

  21.     for my $i ( 0 .. $#pos ) {
  22.         my @flag = map {
  23.             my $F = $pos[$i][$_] / ( $ave[$_] || 1 );
  24.             [ $F = $F <= 0.3 ? 0 : $F > 0.6 ? 2 : 1, 1 ];
  25.         } 0 .. $index;

  26.         separate( $i, @flag );
  27.     }
  28. }

  29. sub separate {
  30.     my $index = shift;
  31.     my @flag = ( [], [], [] );

  32.     for my $f ( 1 .. 3 ) {
  33.         for ( my $i = 0 ; $i <= $#_ - 4 ; $i++ ) {
  34.             next if $_[$i][0] ne $f;
  35.             $i += 7 and next if !$_[ $i + 2 ][1];
  36.             my $end  = $i + 4;
  37.             my $zero = 0;
  38.             for my $x ( reverse $end - 1 .. $end ) {
  39.                 $_[$x][1] ? last : $zero++;
  40.             }

  41.             my $count = grep { $_[$_][0] == $f } $i .. $end - $zero;
  42.             next if $count < 3;
  43.             @{ $_[$_] } = ( $f, 0 ) for $i .. $end - $zero;
  44.             $i += 4 + $zero ? 5 - $zero : 0;
  45.         }
  46.     }

  47.     for my $i ( 0 .. $#_ ) {
  48.         !$flag[ $_[$i][0] ][0] || ( $i - $flag[ $_[$i][0] ][-1][-1] != 1 )
  49.           ? push @{ $flag[ $_[$i][0] ] }, [$i]
  50.           : ( $flag[ $_[$i][0] ][-1][1] = $i );
  51.     }
  52.     my $i;
  53.     for my $f (@flag) {
  54.         $i++;
  55.         for my $range (@$f) {
  56.             @$range <= 1 || $range->[1] - $range->[0] < 2 and next;
  57.             my $range = join '-', map { $_ + $BEGIN } @$range;
  58.             say { $write_fh[$index] } "$txt[$index]\t$CHR\t$range\tf$i";
  59.         }
  60.     }
  61. }

  62. close $_ for @write_fh;
  63. `cat @tmp > result.txt`;    # cat

  64. __DATA__
  65.     ~ 0.3
  66. 0.3 ~ 0.6
  67. 0.6 ~
复制代码

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
2 [报告]
发表于 2014-08-11 16:21 |显示全部楼层
my $师傅 jason680:
  1. 问题本不难,你又不举例,
  2. 描述又乱写,让人费疑猜?
复制代码
难的不是问题 ~ {:2_172:}
最难的是看懂问题 ~ {:2_168:}

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
3 [报告]
发表于 2014-08-11 17:15 |显示全部楼层
谢谢 $师傅解释一下 ~{:2_172:}

回复 5# xiumu2280


   

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
4 [报告]
发表于 2014-08-11 19:40 |显示全部楼层
说实话,我估计看一年也看不懂问题 ~ {:2_176:}

3.txt:
flag3 flag1 flag3 flag1 flag1  flag3  flag1  flag1  flag1   flag1  flag1  

得到结果是:{:2_170:}
3.txt    chr1  1-11  flag1
3.txt    chr1  1-11  flag3


LZ 帮解释一下 what + why ?

A:
f1 f2 f1 f2 f1 f2 f1 f2 f3 f2 f3 f3 f1
B:
f1 f1 f2 f1 f1 f1 f2 f2 f1

得到结果是? and how ?

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-08-12 17:56 |显示全部楼层
给一些复杂的例子, 并解释 ~ {:2_171:}
你的规则 ?

my $question; ~ {:2_168:}

3 3 3 2 2 1 1 1 2 3

1 > 3

1:
2 2 1 1 1 => F1: 4-8
3 3 3 => F3: 1-3


or
2:

1 1 1 2 3 => F1: 6-10
3 3 3 2 2 => F3: 1-5

or ....




example 2.txt

flag3 flag3 flag3 flag2 flag2  flag2  flag2  flag3  flag3   flag3  flag3

f2 > f3

1:
flag3 flag3 flag2 flag2  flag2 => F2: 2-6
flag2  flag3  flag3   flag3  flag3 => F3: 7-11

2:
flag2 flag2  flag2  flag2  flag3 => F2: 4-8
flag3 flag3 flag3 => F3: 1-3
flag3   flag3  flag3 => 9-11

3:
flag3 flag2 flag2  flag2  flag2 => F2: 3-7
flag3  flag3   flag3  flag3 => F3: 8-11

or....

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
6 [报告]
发表于 2014-08-13 11:01 |显示全部楼层
哪里是我的帖子? 我找不到 ?  {:2_167:}

回复 40# huang6894


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP