0

我正在为自然语言处理构建一个标记模型。最初,句子的单词被标记为词性(如名词的 NN),然后应用规则将它们划分为表示为嵌套列表的树。此过程会重复多次,直到您在顶层获得一个节点。我有一个所有潜在树的主列表,我需要消除重复的树,否则整个事情都会在内存中爆炸。这是列表包含的内容的一个小示例。我需要确保列表中的每个列表都是唯一的,因为每次迭代都会创建许多分支。

[[('NP', [('PRP', 'I')]), ('VBD', 'ate'), ('DT', 'a'), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
[('PRP', 'I'), ('VP', [('VBD', 'ate')]), ('DT', 'a'), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
[('PRP', 'I'), ('VBD', 'ate'), ('NP', [('DT', 'a')]), ('NN', 'steak'), ('IN', 'with'), ('DT', 'a'), ('NN', 'knife'), ('.', '.')]
...]

我想过使用一个集合,但列表不可散列。我尝试使用递归,但内存不足。我考虑将列表转换为字符串,使用字符串作为字典键和列表作为值,然后迭代并再次将其转换回列表(或将其保留为字典?)。有没有人有一个不那么骇人听闻的解决方案?我对 Python 比较陌生,所以请解释一下您的解决方案是如何工作的。

我应该澄清一下:嵌套列表可以无限深。树结构不是提前知道的,而是动态构建的。试图构建这样的东西 - http://jos.oxfordjournals.org/content/25/4/345/F23.large.jpg但以嵌套列表的形式。

4

2 回答 2

0

您可以散列元组。这可能会解决您的一些问题(尽管我对您的问题有点困惑)这可以让您将所有现有的元组存储在一个集合中(这是一种可散列的列表)。这样,当您尝试创建您只需调用的每个新元组时

if my_tuple in my_tuple_set:
    # the best way I could find to access the item in a tuple
    stored_tuple = my_tuple_set.pop(my_tuple) 
    my_tupple_set.add(stored_tuple)
    my_tuple = stored_tuple   # reset pointer to stored data

在 python 中处理内存问题有点有趣!

于 2013-10-31T21:58:17.727 回答
0

感谢 sdasdadas 指出重复。我能够(或多或少)通过创建这个函数来解决它:

 def list_to_tuple(a_list):
    temp_list = []
    for item in a_list:
        if isinstance(item, list) or isinstance(item, tuple):
            temp_list.append(list_to_tuple(item))
        else:
            temp_list.append(item)
    return tuple(temp_list)

它需要一个无限深的嵌套列表或元组,并在元组中返回等价的东西。在另一个函数中,我将它传递给一组以确保唯一值,然后它可以返回到列表或其他任何内容。

感谢您的回答。

于 2013-10-31T22:22:55.077 回答