首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设计一个包含许多可选组件的函数

设计一个包含许多可选组件的函数
EN

Software Engineering用户
提问于 2013-03-04 02:12:00
回答 2查看 272关注 0票数 5

我试图找出一个很好的方法来设计一个函数,其中包含(许多)可选组件。

对于一个具体的例子,假设我感兴趣的是设计一个功能提取器函数,它以文档作为输入并返回从文档中提取的特性列表。

问题

如果有许多可选组件,那么什么样的方法会被认为是良好的实践和可伸缩的?

下面是我能想到的几个选项,尽管我可能还没有考虑过其他的方法。

方法1:基于类的

代码语言:javascript
复制
class FeatureExtractor(object):
    """Extract features from text for use in classification."""
    def __init__(self, term_frequency=False, consider_negation=False,
                 pos_tags=False):
        self.term_frequency = term_frequency
        self.consider_negation = consider_negation
        self.pos_tags = pos_tags
        # Could be many more ...

    def extract(self, document):
        """Extract features from a document."""
        features = []
        if self.term_frequency:
            features.extend(self.extract_term_frequency(document))
        if self.consider_negation:
            features.extend(self.extract_negation(document))
        if self.pos_tags:
            features.extend(self.extract_pos_tags(document))
        return features

    def extract_term_frequency(self, document):
        pass

    def extract_negation(self, document):
        pass

    def extract_pos_tags(self, document):
        pass

extractor = FeatureExtractor(term_frequency=True, consider_negation=True,
                             pos_tags=True)
extractor.extract(document)

方法2:函数参数

代码语言:javascript
复制
def extract(document, *functions):
    """Extract features from a document."""
    features = []
    for function in functions:
            features.extend(function(document))
    return features

def extract_term_frequency(document):
    pass

def extract_negation(document):
    pass

def extract_pos_tags(document):
    pass

extract(document, extract_term_frequency, extract_negation, extract_pos_tags)

方法3:具有混合或多继承

的类

第一种方法和第二种方法的结合,虽然我不确定如何做到这一点。

任何关于一个方向的想法,我们将不胜感激!

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2013-03-04 15:53:17

我认为您应该在这里问自己的核心问题是“您期望从文档中提取什么样的特性”?

如果您希望能够轻松地添加新的特性提取器函数,那么可以使用第二个版本,在该版本中,每个特性都会被独立提取并自行处理文档。

另一方面,如果您预先知道您需要什么样的特性,可以使用一个中央提取器,它可以利用这些知识同时提取所有的东西(使用参数来调优这些特性,ofc)

至于类和函数,老实说,我并不认为它们之间有太大的不同,因为它们最终以相同的方式封装了事物。在Python的例子中,我建议在可能的情况下使用“可调用的”(因此您可以在适当的情况下使用函数或定义__call__的对象),并且我总是在类上使用函数,除非我需要跟踪一些额外的内部状态(默认情况下,Python闭包会因为本地的作用域而变差)。

票数 2
EN

Software Engineering用户

发布于 2013-03-04 15:44:22

使用您所显示的内容,我更喜欢函数参数,因为出错的代码较少。我还是会用某种形式把他们联系在一起。

但是,如果我要实现这样的系统,我就不会那么依赖于实现了。我不知道您所说的“从文档中提取特性”是什么意思,但让我们设想一下,文档是汽车的规范,并提到它有合金车轮,使用汽油或柴油等。如果我想提取这些数据,这取决于我是想从一个功能--第一还是从文档的第一方向着手--我会考虑创建我感兴趣的特性的集合,或者我可以从文档中提取的特性的集合。

在第一种情况下,我可以说:

代码语言:javascript
复制
def featuresILike = { "alloy wheels":"/alloy wheels/", "v8 engine":"/V8/" } and so on.

然后,我只需在文档中运行,查找与这些模式的匹配,并在找到这些模式时向文档添加相关的键功能元数据。

在第二种情况下,我可能会查找表示特性列表的模式,然后尝试将特定文档中列出的所有功能提取到元数据中。这样,我就可以根据需要对所有这些问题进行查询。

这种方法在概念上的区别在于,我的目标是将数据作为数据处理,然后使用我的代码来提取数据。每次编写"hasAlloyWheels()“类型函数时,我真正要做的就是将数据转换为代码。有时候,您可能需要这样做,但是如果您可以将这些信息提取到配置中,或者缩小代码范围,使其只发生在几个地方,那么最终您将得到一些更可重用和更易于维护的信息。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/189126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档