0

我正在使用二分图分析我在给定主题和地理位置上下载的推文的网络和语义值。

使用 Python,我创建了一个 .net 文件,其中包含 2 组节点和边。该文件是我单独创建的文件的合并:2 组顶点和边。问题是创建 .net 文件的 Edges 组件。

我有 3 个文件:

  • 带有发件人/高音扬声器(“号码/ID”和“姓名”)的tweeterers.csv
  • words.csv,带有我从推文中提取的语义标签/单词。格式为“编号/ID”和“名称”,“编号”从上述文件的最后一个“编号”开始。每行有 0 到 6 个单词
  • Names_Text_full_clean.csv,带有高音扬声器和单词。每行包含 1 个高音扬声器的名称和 0 到 6 个单词 该文件将为我提供高音扬声器和单词之间的关联,用于图表。

我基本上阅读每个高音喇叭,阅读一个单词,阅读是否有关联。如果是,我写关联(这是一个优势)。是三环。这对于中等规模的网络来说非常缓慢:一个拥有约 650 个节点和约 18000 个边缘的网络在 Mac Mini 2.7GHz 四核上花了我将近 2 天的时间。

任何加速它的帮助将不胜感激!

以下是代码:

import csv # csv library is to handle csv files

# open the twetterers file and make it available in 'reader1'
file_read1 = open('tweeterers.csv', 'rU')
    reader1 = csv.reader(file_read1)

# open the file for writing and make it available in 'writer'
file_write=open('edges.csv', 'wb')
writer=csv.writer(file_write)


for sender in reader1:
    file_read2 = open('words.csv', 'rU')
    reader2 = csv.reader(file_read2)
    for word in reader2:
        file_read = open('Names_Text_full_clean.csv', 'rU')
        reader = csv.reader(file_read)
        for match in reader:
            for elem in range (1,len(match)):
                if sender[1] == match [0]:
                    if word [1] == match [elem]:
                        a = sender[0],word[0]
                        writer.writerow(a)
                        print "I wrote a record: it's: ",a

file_read.close()
file_read1.close()
file_read2.close()
file_write.close()
4

1 回答 1

0

使用字典。例如,第一步是只读Names_Text_full_clean.csv一次并将结果存储在字典中,索引为match[0]. 因为可能有多次相同的情况,您需要将可能的多个对象match[0]的列表存储为值。match

import collections
by_sender = collections.defaultdict(list)
file_read = open('Names_Text_full_clean.csv', 'rU')
reader = csv.reader(file_read)
for match in reader:
    by_sender[match[0]].append(match)

然后在嵌套循环中,您可以替换

    for match in reader:
        if sender[1] == match [0]:

使用以下循环,它可能小数百倍:

    for match in by_sender[sender[1]]:

进一步的优化是不存储match在列表中by_sender[match[0]],而是存储set(match[1:])。实际上,您只会查看特定条目(word[1]在本例中)是否等于match[1:]. 而不是循环来解决这个问题,它可以用 just 来完成word[1] in my_set

这可能就足够了,但“最终目标”是只读取所有三个文件一次。您会将其中两个文件的内容存储在一些合适的字典中,并且仅在遍历第三个文件时才进行字典查找(或“设置查找”,这也非常快)。

于 2013-05-06T17:57:25.133 回答