使用Perl

时间:2016-06-18 06:55:40

标签: perl

我有一个包含每行句子的文字,并在每个单词的前面以其lemmetize形式为例:

他“他”去“去”学校“学校”与“他的”他的“他的”朋友“freind”

我想在每一行中提取三个字三个字。结果如下:

他“他”去“去”“去”\ n
去“去”学校“学校”\ n
以“带”的方式“到”学校“学校”\ n
学校“学校”与“与”他的“他的”\ n 与“与”他的“他的”朋友“freind”\ n

我想用Perl做这件事。

2 个答案:

答案 0 :(得分:0)

谢谢大家的帮助,我找到了解决方案,它有效,但我认为这是脏代码,这就是为什么我问这个问题,找到更好的解决方案,awk解决方案看起来很棒,但结果不像我看,

这是解决方案我将窗口固定为7个单词并且在每个单词的前面它是POS并且它是lemmetized形式: 他“他”“PRO”去“去”“V”到“到”“PREP”学校“学校”“N”......

In [46]: %timeit (pd.merge(df1,df2, left_on='Name', right_on='Player').rename(columns={'Gender':'sex'}).drop('Player', axis=1))
The slowest run took 4.53 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 2.53 ms per loop

In [47]: %timeit df1.Name.map(df2.set_index('Player')['Gender'])
The slowest run took 4.78 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 882 µs per loop

答案 1 :(得分:0)

此脚本首先将整行读取为一个单词数组(@words),然后使用@aux数组作为FIFO ...在每次传递时丢弃前两个元素并保持FIFO大小始终为6。 ..然后,当@words数组中有单词时重新开始:

#!/usr/bin/perl
use strict;

my $file = 'file.txt';
open(F,$file)||die "error";
my @aux;
while(<F>) {
  my @words = split /\s+/;
  while($#words >= 0) {
    while($#aux < 5 && $#words >= 0) {
      my $a = shift @words;
      push @aux, $a;
    }
    print ((join " ", @aux)."\n");
    shift @aux;
    shift @aux;
  }
}