如何过滤db.body中的单词

时间:2015-06-11 05:17:39

标签: web2py web2py-modules

我正在制作一个程序,我想过滤掉一些单词,使用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....

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

1 个答案:

答案 0 :(得分:0)

您有几种选择。首先,您可以创建一个仅用作过滤器的自定义验证器。验证器获取一个值并返回一个包含(可能已转换)值和None或错误消息的元组(在这种情况下,我们希望返回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验证程序,以确保过滤后的输入不为空。

另一种选择是通过字段的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中或使用virtual field,而不是在存储输入之前对输入进行过滤。