0

我正在开发一个程序,我想过滤掉一些单词,使用 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() 约束中。这可能吗?正在处理用户输入(将字符串保存到数据库),它会自动删除我选择的停用词,而不是使用上面显示的代码段。

4

1 回答 1

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))

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

最后,您可以考虑存储原始输入,然后将过滤后的输入存储在单独的计算字段中或使用虚拟字段,而不是在存储之前对其进行过滤。

于 2015-06-11T14:53:58.193 回答