如何过滤 db.body 中的单词

How to filter words in db.body

我正在开发一个程序,我想过滤掉一些单词,使用 nltk 样式来删除停用词,如下所示:

def phrasefilter(phrase):
    phrase = phrase.replace('hi', 'hello')
    phrase = phrase.replace('hey', 'hello')
    phrase = re.sub('[^A-Za-z0-9\s]+', '', phrase.lower())
    noise_words_set = ['of', 'the', 'at', 'for', 'in', 'and', 'is', 'from', 'are', 'our', 'it', 'its', 'was', 'when', 'how', 'what', 'like', 'whats', 'now', 'panic', 'very']
    return ' '.join(w for w in phrase.split() if w.lower() not in noise_words_set)

有没有办法在 web2py DAL 上执行此操作。

db.define_table( words,
    Field(words1, REQUIRES  IS_NOT_NULL(), REQUIRES....

我想把它放在 REQUIRES IS_NOT_IN_NOISE_WORDS_SET() 约束中。这可能吗?我正在处理用户输入(将字符串保存到数据库),它会自动删除我选择的停用词,而不是使用上面显示的代码段。

您有多种选择。首先,您可以创建一个自定义验证器,它只是充当过滤器。验证器采用一个值和 returns 一个元组,其中包括(可能已转换的)值和 None 或错误消息(在这种情况下,我们希望 return None 作为元组的第二个元素,因为我们只转换值而不检查错误)。

def filter_noise_words(input):
    filtered_input = [code to remove stop words]
    return (filtered_input, None)

db.define_table('words',
                Field('words1', requires=[filter_noise_words, IS_NOT_EMPTY()]))

注意,IS_NOT_EMPTY 验证器在过滤之后出现,以确保 post 过滤后的输入不为空。

另一种选择是通过字段的 filter_in 属性进行过滤:

def filter_noise_words(input):
    filtered_input = [code to remove stop words]
    return filtered_input

db.define_table('words',
                Field('words1', requires=IS_NOT_EMPTY(), filter_in=filter_noise_words))

使用 filter_in 的优点是它适用于所有插入和更新(通过 DAL 进行),而验证器仅在使用 SQLFORM 时(或显式调用特殊 .validate_and_insert.validate_and_update 方法)。 filter_in 的缺点是在 任何验证器之后 应用过滤器,因此 IS_NOT_EMPTY 将 运行 应用于预过滤输入。

最后,与其在存储之前过滤输入,不如考虑存储原始输入,然后将过滤后的输入存储在单独的 computed field or using a virtual field.