我有一个包含每行句子的文字,并在每个单词的前面以其lemmetize形式为例:
他“他”去“去”学校“学校”与“他的”他的“他的”朋友“freind”
我想在每一行中提取三个字三个字。结果如下:
他“他”去“去”“去”\ n
去“去”学校“学校”\ n
以“带”的方式“到”学校“学校”\ n
学校“学校”与“与”他的“他的”\ n
与“与”他的“他的”朋友“freind”\ n
我想用Perl做这件事。
答案 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;
}
}