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