3.4 转换数据格式
已标注语言数据很少以最方便的格式保存,往往需要进行各种格式转换。字符编码之间的转换已经讨论过(见3.3)。在这里,我们专注于数据结构。
最简单的情况,输入和输出格式是同构的。例如,我们可能要将词汇数据从 Toolbox 格式转换为 XML,可以直接一次一个的转换词条(4)。数据结构反映在所需的程序的结构中:一个for
循环,每次循环处理一个词条。
另一种常见的情况,输出是输入的摘要形式,如一个倒置的文件索引。有必要在内存中建立索引结构(见4.8),然后把它以所需的格式写入一个文件。下面的例子构造一个索引,映射字典定义的词汇到相应的每个词条的语意,已经对定义文本分词,并丢弃短词。一旦该索引建成,我们打开一个文件,然后遍历索引项,以所需的格式输出行。
>>> idx = nltk.Index((defn_word, lexeme) ![[1]](/projects/nlp-py-2e-zh/Images/346344c2e5a627acfdddf948fb69cb1d.jpg)
... for (lexeme, defn) in pairs ![[2]](/projects/nlp-py-2e-zh/Images/f9e1ba3246770e3ecb24f813f33f2075.jpg)
... for defn_word in nltk.word_tokenize(defn) ![[3]](/projects/nlp-py-2e-zh/Images/13f25b9eba42f74ad969a74cee78551e.jpg)
... if len(defn_word) > 3) ![[4]](/projects/nlp-py-2e-zh/Images/92cc2e7821d464cfbaaf651a360cd413.jpg)
>>> with open("dict.idx", "w") as idx_file:
... for word in sorted(idx):
... idx_words = ', '.join(idx[word])
... idx_line = "{}: {}".format(word, idx_words) ![[5]](/projects/nlp-py-2e-zh/Images/63a8e4c47e813ba9630363f9b203a19a.jpg)
... print(idx_line, file=idx_file)
由此产生的文件dict.idx
包含下面的行。(如果有更大的字典,我们希望找到每个索引条目中列出的多个语意)。
body: sleep
cease: wake
condition: sleep
down: walk
each: walk
foot: walk
lifting: walk
mind: sleep
progress: walk
setting: walk
sleep: wake