3.4 转换数据格式

已标注语言数据很少以最方便的格式保存,往往需要进行各种格式转换。字符编码之间的转换已经讨论过(见3.3)。在这里,我们专注于数据结构。

最简单的情况,输入和输出格式是同构的。例如,我们可能要将词汇数据从 Toolbox 格式转换为 XML,可以直接一次一个的转换词条(4)。数据结构反映在所需的程序的结构中:一个for循环,每次循环处理一个词条。

另一种常见的情况,输出是输入的摘要形式,如一个倒置的文件索引。有必要在内存中建立索引结构(见4.8),然后把它以所需的格式写入一个文件。下面的例子构造一个索引,映射字典定义的词汇到相应的每个词条[1]的语意[2],已经对定义文本分词[3],并丢弃短词[4]。一旦该索引建成,我们打开一个文件,然后遍历索引项,以所需的格式输出行[5]

  1. >>> idx = nltk.Index((defn_word, lexeme) ![[1]](/projects/nlp-py-2e-zh/Images/346344c2e5a627acfdddf948fb69cb1d.jpg)
  2. ... for (lexeme, defn) in pairs ![[2]](/projects/nlp-py-2e-zh/Images/f9e1ba3246770e3ecb24f813f33f2075.jpg)
  3. ... for defn_word in nltk.word_tokenize(defn) ![[3]](/projects/nlp-py-2e-zh/Images/13f25b9eba42f74ad969a74cee78551e.jpg)
  4. ... if len(defn_word) > 3) ![[4]](/projects/nlp-py-2e-zh/Images/92cc2e7821d464cfbaaf651a360cd413.jpg)
  5. >>> with open("dict.idx", "w") as idx_file:
  6. ... for word in sorted(idx):
  7. ... idx_words = ', '.join(idx[word])
  8. ... idx_line = "{}: {}".format(word, idx_words) ![[5]](/projects/nlp-py-2e-zh/Images/63a8e4c47e813ba9630363f9b203a19a.jpg)
  9. ... print(idx_line, file=idx_file)

由此产生的文件dict.idx包含下面的行。(如果有更大的字典,我们希望找到每个索引条目中列出的多个语意)。

  1. body: sleep
  2. cease: wake
  3. condition: sleep
  4. down: walk
  5. each: walk
  6. foot: walk
  7. lifting: walk
  8. mind: sleep
  9. progress: walk
  10. setting: walk
  11. sleep: wake