我有一个csv文件,用分号分隔。这个文件包含一个丹麦语词典,我需要从中提取词干和后缀。我需要用AWK来做!
档案:
adelig;adelig;adj.;1
adelig;adelige;adj.;2
adelig;adeligt;adj.;3
adelig;adeligst;adj.;5
voksen;voksen;adj.;1
voksen;voksne;adj.;2
voksen;voksent;adj.;3
voksen;voksnest;adj.;5
virkemiddel;virkemiddel;sb.;1
virkemiddel;virkemidlet;sb.;2
virkemiddel;virkemidlets;sb.;3
virkemiddel;virkemiddels;sb.;4
virkemiddel;virkemidlerne;sb.;5
virkemiddel;virkemidlernes;sb.;6
virkemiddel;virkemiddel;sb.;7
virkemiddel;virkemidler;sb.;7
virkemiddel;virkemiddels;sb.;8
virkemiddel;virkemidlers;sb.;8
预期输出:
adelig;adelig; ,e,t,*,st
voksen;voks; ,ne,ent,*,nest
virkemiddel;virkemid ,let,lets,dels,lerne,lernes,del;ler,dels;lers
第四列是形式。如果缺少某些形式,后缀将被星号代替。如adelig;adelig; ,e,t,*,st
如果形式(数字)重复,后缀将被分号分隔。如virkemiddel;virkemid ,let,lets,dels,lerne,lernes,del;ler,dels;lers
我开始写这段代码,但是我没有得到处理多个可能词干的算法。
BEGIN{
FS=";"
}
{
lemm=$1;
form=$2;
if(match(form, lemm) > 0)
{
root=lemm;
sub(root,"",form);
suf[$1]=suf[$1]","form;
}
else
{
split($1,a,"");
split($2,b,"");
s="";
for(i in a)
{
if(b[i]!=a[i])
{
break;
}
s = s "" a[i];
}
}
root=s;
}
4条答案
按热度按时间aemubtdh1#
下面是一些awk代码,用于查找常见的前缀长度并确定后缀列表。
根据您的输入,输出为
v09wglhw2#
这可能是Python中一个很好的起点,它使用
os.path.commonprefix
从单词列表中获取词干。它会传回:
eqoofvh93#
TXR中的三种解决方案。第一种是使用提取语言构建基于结构的显式数据模型,然后处理结构:
运行时间:
请注意细微的差异:
此分号不包括在原始所需输出中;没有给出排除依据的理由,因此目前将其视为印刷错误。
表达式
(ret [@1 0..(mismatch @1 @2)])
产生了一个两参数函数,它返回一对字符串的公共前缀。要返回一个字符串列表的公共前缀,我们使用这个函数作为reduce-left
的内核。第二个版本,没有数据结构化。在
data
上产生相同的输出:纯TXRLisp解决方案,不使用提取语言。一个巨大的表达式读取输入行,将其拆分,将第四个字段转换为整数,按词根对条目进行分组,等等:
运行时间:
xienkqul4#
这是我得到预期结果的代码。代码中的注解表明了对glenn代码的主要修改。
我不得不修改代码。我没有考虑过这种决疑术。当引理对动词和副词是一样的时候。