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

Get the category of a given sentence from a categorized corpus using NLTK

我使用 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"))

在此先感谢您的帮助。

A 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'])

NLTK 的语料库 reader 的 sents() 函数 returns 列表的列表。对于循环创建将句子映射到类别的字典来说,这不是一个特别有效的结构。

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

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