使用 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 秒内完成,而不是整夜。
我使用 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 秒内完成,而不是整夜。