如何根据培训文本构建一个干净的词汇表?

时间:2018-05-17 07:40:29

标签: nlp

我正在关注神经机器翻译教程here并注意到他们使用的数据集提供了clean vocab file。但是当我遇到一个没有提供词汇文件的数据集(例如Europarl v8)时,我需要使用以下函数自己构建一个词汇表。

def construct_vocab_from_file(file, vocab_file):
    # Read file, tokenize it and then sort it
    with open(file, 'r') as f:
        raw_data = f.read()
        tokens = nltk.wordpunct_tokenize(raw_data)
        words = [w.lower() for w in tokens]
        vocab = sorted(set(words))

    # Write vocab to file
    with open(vocab_file, 'w') as f:
        for w in vocab:
            f.write(w + "\n")

但是,以这种方式构建的词汇看起来有点混乱。 enter image description here

左边是干净的词汇文件,而右边的是黑色背景(数字是行号)来自我构建的词汇。这不会让我感到舒服,特别是超过一半的词汇由这些特殊字符或数字组成(例如0,00,000,0000,0000003)。

所以我的问题是:

1)这有问题吗?

2)我应该进一步处理它吗?

1 个答案:

答案 0 :(得分:1)

这取决于您使用的标记化过程。由于您使用的是wordpunct tokenizer,它基本上可以看到类似于\w+|[^\w\s]+http://www.nltk.org/api/nltk.tokenize.html)的任何内容作为令牌,这就是您所获得的。 有这些类型的条目填充了一半以上的词汇听起来很多,但显然取决于您的输入数据 您可以考虑使用更复杂的标记器,但考虑到这些类型的条目可能具有非常低的频率(即我们猜测它们中的大部分只会出现一次),我不会担心太多了。

因为你正在使用Europarl的东西;还有一个tokenizer(perl)脚本,你可以使用它来输出标记化的文本,这样当你在python中读取它时,拆分空格意味着标记化。不确定moses / europarl tokenizer是否比NLTK的wordpunct更复杂。