我正在关注神经机器翻译教程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")
左边是干净的词汇文件,而右边的是黑色背景(数字是行号)来自我构建的词汇。这不会让我感到舒服,特别是超过一半的词汇由这些特殊字符或数字组成(例如0,00,000,0000,0000003)。
所以我的问题是:
1)这有问题吗?
2)我应该进一步处理它吗?
答案 0 :(得分:1)
这取决于您使用的标记化过程。由于您使用的是wordpunct tokenizer,它基本上可以看到类似于\w+|[^\w\s]+
(http://www.nltk.org/api/nltk.tokenize.html)的任何内容作为令牌,这就是您所获得的。
有这些类型的条目填充了一半以上的词汇听起来很多,但显然取决于您的输入数据
您可以考虑使用更复杂的标记器,但考虑到这些类型的条目可能具有非常低的频率(即我们猜测它们中的大部分只会出现一次),我不会担心太多了。
因为你正在使用Europarl的东西;还有一个tokenizer(perl)脚本,你可以使用它来输出标记化的文本,这样当你在python中读取它时,拆分空格意味着标记化。不确定moses / europarl tokenizer是否比NLTK的wordpunct更复杂。