如何用awk提取土耳其语单词词根并合并统计词频?
土耳其语词根词频合并统计方案
仅靠纯规则匹配能处理部分简单场景,但要准确覆盖所有土耳其语单词的词根提取,必须借助词典。
一、针对示例的临时规则方案
你的示例中所有目标单词均以kadın为词根,可通过awk正则匹配直接将这类单词映射到词根,实现词频合并。
修改后的awk脚本:
{ $0 = tolower($0) gsub(/[[:punct:]]/, "") for(i=1;i<=NF;i++) { # 匹配以kadın开头的单词,统一归为词根kadın root = ($i ~ /^kadın/) ? "kadın" : $i a[root]++ } } END { for(k in a) print k,a[k] }
运行后即可得到你想要的kadın 5结果,但这种方法有明显局限性:
- 仅能处理预设的词根,无法覆盖所有土耳其语单词
- 土耳其语作为黏着语,存在元音和谐、辅音同化等复杂音变规则,纯正则无法应对所有变形场景
二、准确处理必须借助词典
土耳其语的黏着语特性决定了词根可叠加大量后缀(复数、格变化、所有格等),且存在不规则音变,仅靠正则无法准确识别所有词根:
- 部分词根加后缀时会发生音变(如
ev→eve→evler→evimden),复杂变形无法通过简单正则匹配 - 可能出现不同词根但后缀/前缀相似的情况,纯规则会导致误判
因此,要准确实现全场景的词根词频合并,必须依赖土耳其语词根映射词典,具体实现思路:
- 准备词典文件(如
turkish_root_dict.txt),每行格式为单词 词根 - 在awk脚本中预先加载词典到数组,处理文本时通过单词查找到对应词根,再统计词根词频
示例脚本:
# 预先加载词根词典 BEGIN { while ((getline line < "turkish_root_dict.txt") > 0) { split(line, arr, /\s+/) dict[arr[1]] = arr[2] } close("turkish_root_dict.txt") } { $0 = tolower($0) gsub(/[[:punct:]]/, "") for(i=1;i<=NF;i++) { # 查词典获取词根,未找到则保留原词 root = ($i in dict) ? dict[$i] : $i a[root]++ } } END { for(k in a) print k,a[k] }
内容的提问来源于stack exchange,提问作者zeynel
相关产品推荐
相关产品推荐

