在keras tokenizer中包含标点符号

Include punctuation in keras tokenizer

有没有办法在 keras tokenizer 中包含标点符号?
我想变身...

来自

Tomorrow will be cold.

Index-tomorrow, Index-will,...,Index-point

我怎样才能做到这一点?

如果您对文本做一些 pre-processing,这是可能的。

首先你要确保标点符号没有被分词器过滤掉。您可以从文档中看到 Tokenizer 在初始化时采用过滤器参数。您可以将默认值替换为要过滤的字符集,并排除要在索引中包含的字符。

第二部分是确保标点符号被识别为它自己的标记。如果您标记例句,结果将采用 "cold." 作为标记,而不是 "cold" 和“.”。您需要的是单词和标点符号之间的分隔符。一种天真的做法是用 space + 标点符号替换文本中的标点符号。

以下代码完成您的要求:

from keras.preprocessing.text import Tokenizer

t = Tokenizer(filters='!"#$%&()*+,-/:;<=>?@[\]^_`{|}~\t\n') # all without .
text = "Tomorrow will be cold."
text = text.replace(".", " .")
t.fit_on_texts([text])
print(t.word_index)

-> 打印:{'will': 2, 'be': 3, 'cold': 4, 'tomorrow': 1, '.': 5}

替换逻辑可以以更智能的方式完成(例如,如果您想捕获所有标点符号,则使用正则表达式),但您明白了要点。

一个通用的解决方案,灵感来自lmartens提出的解决方案,使用正则表达式替换一组标点符号。这里的代码:

from keras.preprocessing.text import Tokenizer
import re

to_exclude = '!"#$%&()*+-/:;<=>@[\]^_`{|}~\t\n'
to_tokenize = '.,:;!?'
t = Tokenizer(filters=to_exclude) # all without .
text = "Tomorrow, will be. cold?"
text = re.sub(r'(['+to_tokenize+'])', r'  ', text)
t.fit_on_texts([text])
print(t.word_index) # {'tomorrow': 1, ',': 2, 'will': 3, 'be': 4, '.': 5, 'cold': 6, '?': 7}