使用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"))
提前感谢您的帮助。
答案 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秒内完成,而不是整晚。