在python中对姓氏进行分类的最快方法

时间:2016-07-24 00:27:13

标签: python nlp classification nltk

我有一份包含来自人口普查的12K亚洲姓氏的名单和一份名称为200K的名单。我想将这些200K人归类为亚洲人或非亚洲人,因为他们的姓氏出现在我的12K名单上。

有没有一种快速的方法可以验证列表中最重要的一个是否包含12K列表中的一个姓氏?

4 个答案:

答案 0 :(得分:4)

执行此操作的最佳方法是将12K列表转换为设置数据结构。然后,您可以迭代人口普查数据并检查每个人是否在集合中。

# O(n) where n is the length of the surname_list
surname_set = set(surname_list)

for name in census:
    # This is now O(1) operation
    if name in surname_set:
        do whatever...

这几乎可以肯定是用Python或任何语言完成所需内容的最快方法,并且在200K大小的列表上应该相当快。

Wai Leong Yeow建议使用二进制搜索,这比直接检查列表更快,但仍然是200K不同名称的O(log n)操作,其中N是12,000,这意味着它可能会超过迭代部分速度慢10倍(这是一种简化 - 实际上有一些常数因素被大O符号掩盖,但恒定时间解决方案当然仍然更快)。对它进行排序将花费O(n log n)时间,其中将其转换为集合花费O(n)时间,这意味着该方法也具有更快的预处理。

答案 1 :(得分:0)

这取决于你真正的问题。你想要机器学习(如你标记:分类)来预测亚洲/非亚洲名称吗?

如果是:尝试一些半监督方法。要做到这一点,首先随机选择(接近10%)你的200k数据,然后在12k中搜索它,如果存在,将其标记为1,否则将其标记为0.然后使用一些分类算法,如随机森林,SVM或KNN。你也可以为你的名字建模,比如Bag Of word(在你的问题Bag Of Letter!或类似的东西):https://en.wikipedia.org/wiki/Bag-of-words_model

对于分类任务,请查看scikit-learn lib:http://scikit-learn.org/

如果否(您不想使用机器学习解决方案): 存在一些快速字符串搜索算法,其使用一些技术来搜索其他字符串的语料库中的字符串。有很多算法,比如Boyer Moore:https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm

有关详细信息,这可能很好:https://softwareengineering.stackexchange.com/questions/183725/which-string-search-algorithm-is-actually-the-fastest

答案 2 :(得分:0)

我建议在训练任何机器学习模型之前在第一步中使用local sensitive hashing。这可能会有所帮助,因为你没有很多功能。如果你想要更强大的东西,你可以使用Naive Bayes和一些特征工程。

答案 3 :(得分:-1)

取决于你的意思"快速"。

James建议使用Python内置的set来测试会员资格。 Python的set实现使用哈希表。 平均时间复杂度为O(1),但最差情况可以为O(n),其中n是亚洲姓氏集的基数。因此,在最坏情况场景中,可能最终只有O(mn)而不是O(m),其中m是要分类的名称集的基数。

供参考,请参阅:https://wiki.python.org/moin/TimeComplexity

如果您想在最坏的情况下获得保证,您可以通过对集合n进行排序并进行二分查找来实现。这将最终导致O(m lg n)时间复杂度。

二进制搜索:https://docs.python.org/3.1/library/bisect.html

这实际上取决于散列函数对数据的效果。