使用Perl的Wordnet同义词集

7
我安装了Wordnet::SimilarityWordnet::QueryData这两个模块,以便轻松计算与之相关的信息内容得分和概率。但我卡在了这个基本问题上:给定一个单词,打印出n个相似的单词——这应该不难,只需遍历同义词集并执行join操作即可。
使用wn命令,并通过大量的trsort | uniq管道命令,我可以获得所有单词的列表:
 wn cat -synsn | grep -v Sense | tr '=' ' ' | tr '>' ' ' | tr '\t' ' ' | tr ',' '\n' | sort | uniq

输出

8 senses of cat                                                         
adult female
adult male
African tea
Arabian tea
big cat
bozo
cat
cat
CAT
Caterpillar
cat-o'-nine-tails
 computed axial tomography
computed tomography
computerized axial tomography
computerized tomography
CT
excitant
felid
      feline
      gossip
gossiper
gossipmonger
guy
hombre
kat
khat
      man
newsmonger
qat
quat
rumormonger
rumourmonger
      stimulant
stimulant drug
Synonyms/Hypernyms (Ordered by Estimated Frequency) of noun cat
      tracked vehicle
true cat
      whip
      woman
X-radiation
      X-raying

但它有点恶心,需要进一步清理。
以下是我的脚本样子,我想要的是cat#n1...8中的所有单词。 脚本
use WordNet::QueryData;

my $wn = WordNet::QueryData->new( noload => 1);

print "Senses: ", join(", ", $wn->querySense("cat#n")), "\n";
print "Synset: ", join(", ", $wn->querySense("cat", "syns")), "\n";
print "Hyponyms: ", join(", ", $wn->querySense("cat#n#1", "hypo")), "\n";

输出:

Senses: cat#n#1, cat#n#2, cat#n#3, cat#n#4, cat#n#5, cat#n#6, cat#n#7, cat#n#8
Synset: cat#n, cat#v
Hyponyms: domestic_cat#n#1, wildcat#n#3

脚本

use WordNet::QueryData;
my $wn = WordNet::QueryData->new;

foreach $word (qw/cat#n/) {

    @senses = $wn->querySense($word);

    foreach $wps (@senses) {
            @gloss = $wn -> querySense($wps, "syns");
            print "$wps : @gloss\n";
    }

}

输出:

cat#n#1 : cat#n#1 true_cat#n#1
cat#n#2 : guy#n#1 cat#n#2 hombre#n#1 bozo#n#2
cat#n#3 : cat#n#3
cat#n#4 : kat#n#1 khat#n#1 qat#n#1 quat#n#1 cat#n#4 Arabian_tea#n#1 African_tea#n#1
cat#n#5 : cat-o'-nine-tails#n#1 cat#n#5
cat#n#6 : Caterpillar#n#2 cat#n#6
cat#n#7 : big_cat#n#1 cat#n#7
cat#n#8 : computerized_tomography#n#1 computed_tomography#n#1 CT#n#2 computerized_axial_tomography#n#1 computed_axial_tomography#n#1 CAT#n#8

附言:我以前从未写过Perl,但我从早上开始研究Perl脚本-现在可以理解基础知识。只需要知道是否有更清晰的方法使用API文档-无法从API或用户组归档中找到。

更新:

我想我会选择:

 wn cat -synsn | sed '1,6d' |sed 's/Sense [[:digit:]]//g' | sed 's/[[:space:]]*=> //' | sed '/^$/d'

sed很棒!


1
给出一些示例输入/输出,你会更快地得到更好的答案。 - TLP
谢谢 @TLP 的提示 :D .. 添加了一些东西! - Tathagata
你的输出似乎与猫无关。 - TLP
顺便说一下,在大多数简单情况下,“sed a | sed b” 可以合并为单个 “sed” 脚本 “sed -e a -e b”。 - tripleee
2个回答

4

我认为你会发现以下内容有帮助...

http://marimba.d.umn.edu/WordNet-Pairs/

根据WordNet,X最相似的N个单词是什么?

这些数据旨在回答这个问题,相似性基于WordNet :: Similarity中的测量。http://wn-similarity.sourceforge.net

-------------- 动词数据

这些文件是使用WordNet 3.0和WordNet :: Similarity版本2.05创建的。它们显示了WordNet中找到的所有动词-动词相似性对,包括路径、wup、lch、lin、res和jcn测量。路径、wup和lch基于路径,而res、lin和jcn基于信息内容。

截至2011年3月15日,使用上述六种方法的所有动词的成对度量已经可用,每个度量值都在自己的.tar文件中。每个*.tar文件的名称为WordNet-verb-verb-MEASURE-pairs.tar,压缩后大小约为2.0-2.4 GB。在这些.tar文件中,您将找到25,047个文件,每个文件对应一个动词意义。每个文件由25,048行组成,除第一行外,每行都包含一个WordNet动词意义和与该特定文件中所示意义的相似度。通过计算,您会发现每个.tar文件包含约6.25亿个成对相似度值。请注意,这些是对称的(sim(A,B)= sim(B,A)),因此您有超过3亿个独特值。

-------------- 名词数据

截至2011年8月19日,使用路径度量衡量所有名词的配对度量已经可用。该文件名为WordNet-noun-noun-path-pairs.tar,压缩后大小约为120GB。在该文件中,您将找到146,312个文件,每个文件对应一个名词义项。每个文件由146,313行组成,除第一行外,每行包含一个WordNet名词义项和与该特定文件中所示义项的相似度。通过计算,您会发现每个.tar文件包含约210亿个配对相似度值。请注意,这些值是对称的(sim(A,B)= sim(B,A)),因此您拥有大约100亿个唯一值。
我们目前正在运行wup、res和lesk,但尚未确定可用日期。

好的,您是来自明尼苏达大学的Predersen教授吗?我真的不知道如何控制我的兴奋 - /me 是您的忠实粉丝 :D。如果能把这个作为正确答案,我将感到非常荣幸!耶! - Tathagata
我不认为有人会冒充我,所以是我本人。 :) 如果您有更多问题,请通过我们的邮件列表或直接联系我们,我们很快就会回复,我只是偶然在这里发现了这个问题。有关更多详细信息,请访问http://wn-similarity.sourceforge.net。 - Ted Pedersen
我希望我早点能够访问到这个...随着截止日期的迅速临近,不知道我能否完成。(跑去找导师 :P) - Tathagata

0
将此放入脚本中,命名为synonym.sh。
wn $1 -synsn | sed '1,6d' |sed 's/Sense [[:digit:]]//g' | sed 's/[[:space:]]*=> //' | sed '/^$/d' | sed 's/ //g' | grep -iv $1 | tr '\n' ',' 
wn $1 -synsv | sed '1,6d' |sed 's/Sense [[:digit:]]//g' | sed 's/[[:space:]]*=> //' | sed '/^$/d' | sed 's/ //g' | grep -iv $1 | tr '\n' ',';echo 

从您的 Perl 脚本中

system("/path/synonym.sh","kittens");
system("/path/synonym.sh","cats");

我面临着类似的挑战,但我无法让它工作。我创建了synonym.sh文件,并在Perl脚本中输入了这两个命令。 - tinonetic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接