使用NLTK从分类语料库中获取给定句子的类别

时间:2017-01-30 16:51:17

标签: python nltk corpus

使用NLTK,我创建了一个大约10万个句子的分类语料库,分为36个类别。

我可以像这样访问特定类别的句子:

romantic_comedies_sents = (my_corpus.sents(categories='romantic_comedies'))

但是,如果以list这样的标记["You", "had", "me", "at", "hello"]的形式给出句子,我希望能够有效地识别出现它的类别。有这么快的方法吗?

我尝试创建和使用带有句子作为键和类别作为值的字典,但是在我的计算机上创建此字典需要很长时间(特别是与NLTK的内置方法相比)和我我想知道是否有更好的方法,最好使用NLTK。

最终,我试图为每个句子结束这种结构:

(["You", "had", "me", "at", "hello"], set("romantic_comedies"))

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

prefix tree是创建将序列映射到值的字典的有效方法。以下是一个简单的实现:

class Node(object):
    def __init__(self, word=None):
        self.word = word
        self.children = {}
        self.categories = set()

    def add(self, sentence, category):
        if len(sentence):
            word = sentence[0]
            sentence = sentence[1:]
            if word not in self.children:
                self.children[word] = Node(word);
            self.children[word].add(sentence, category)
        else:
            self.categories.add(category)

    def find(self, sentence):
        if len(sentence):
            word = sentence[0]
            sentence = sentence[1:]
            if word not in self.children:
                return []
            return self.children[word].find(sentence)
        else:
            return self.categories

class PrefixTree(object):
    def __init__(self):
        self.root = Node()

    def add(self, sentence, category):
        self.root.add(sentence, category)

    def find(self, sentence):
        return self.root.find(sentence)

像这样使用:

def main():
    tree = PrefixTree()
    sentence = ["You", "had", "me", "at", "hello"]
    tree.add(sentence, "romantic_comedies")
    print tree.find(sentence)

输出:

set(['romantic_comedies'])

答案 1 :(得分:0)

NLTK的语料库阅读器的sents()函数返回一个列表列表。这不是一个特别有效的结构,用于循环创建将句子映射到类别的字典。

答案是将句子转换为元组,将句子列表转换为集合(我只需要不同的句子)。

一旦转换,用于创建字典映射到类别的字典的循环在18秒内完成,而不是整晚。