我使用Brown corpus ic-brown.dat来计算wordnet nltk库中单词的信息内容。但结果并不好看。我想知道如何构建自己的custome.dat(信息内容文件)。
custom_ic = wordnet_ic.ic('custom.dat')
答案 0 :(得分:2)
在(...)/ nltk_data / corpora / wordnet_ic / 中,您会找到 IC-compute.sh ,其中包含对某些Perl脚本的一些调用以生成IC来自给定语料库的dat文件。我创建的指令很棘手,我没有需要Perl脚本,所以我决定通过分析dat文件结构和wordnet.ic()函数来创建一个python脚本。
您可以通过在语料库阅读器对象上调用 wordnet.ic()函数来计算自己的IC计数。实际上,您只需要一个带有word()函数的对象,该函数返回语料库中的所有单词。有关更多详细信息,请查看文件.... / nltk / corpus / reader / wordnet.py中的ic函数(第1729行至第1789行)。
例如,对于BNC语料库的XML版本(2007):
reader_bnc = nltk.corpus.reader.BNCCorpusReader(root='../Corpus/2554/2554/download/Texts/', fileids=r'[A-K]/\w*/\w*\.xml')
bnc_ic = wn.ic(reader_bnc, False, 0.0)
要生成.dat文件,我创建了以下函数:
def is_root(synset_x):
if synset_x.root_hypernyms()[0] == synset_x:
return True
return False
def generate_ic_file(IC, output_filename):
"""Dump in output_filename the IC counts.
The expected format of IC is a dict
{'v':defaultdict, 'n':defaultdict, 'a':defaultdict, 'r':defaultdict}"""
with codecs.open(output_filename, 'w', encoding='utf-8') as fid:
# Hash code of WordNet 3.0
fid.write("wnver::eOS9lXC6GvMWznF1wkZofDdtbBU"+"\n")
# We only stored nouns and verbs because those are the only POS tags
# supported by wordnet.ic() function
for tag_type in ['v', 'n']:#IC:
for key, value in IC[tag_type].items():
if key != 0:
synset_x = wn.of2ss(of="{:08d}".format(key)+tag_type)
if is_root(synset_x):
fid.write(str(key)+tag_type+" "+str(value)+" ROOT\n")
else:
fid.write(str(key)+tag_type+" "+str(value)+"\n")
print("Done")
generate_ic_file(bnc_ic, "../custom.dat")
然后,只需调用函数:
custom_ic = wordnet_ic.ic('../custom.dat')
所需的进口是:
import nltk
from nltk.corpus import wordnet as wn
from nltk.corpus import wordnet_ic
import codecs