Python 优化二部图的索引脚本

Python 优化二部图的索引脚本,python,indexing,bipartite,Python,Indexing,Bipartite,我正在使用二分图分析我在给定主题和地理位置上下载的推特的网络和语义值 使用Python,我创建了一个包含两组节点和边的.net文件。这个文件是我单独创建的文件的合并:两组顶点和边。 问题是创建.net文件的边缘组件 我有3个文件: tweeters.csv带有发送者/推特者(“编号/ID”和“名称”) words.csv,带有我从推文中提取的语义标记/单词。格式为“编号/ID”和“名称”,其中“编号”从上述文件的最后一个“编号”开始。每行有0到6个单词 名称\u文本\u全文\u clean.c

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

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

我有3个文件:

  • tweeters.csv带有发送者/推特者(“编号/ID”和“名称”)
  • words.csv,带有我从推文中提取的语义标记/单词。格式为“编号/ID”和“名称”,其中“编号”从上述文件的最后一个“编号”开始。每行有0到6个单词
  • 名称\u文本\u全文\u clean.csv,带有推特和文字。每一行包含1个推特者的名字和0到6个单词。这个文件将为我提供推特者和单词之间的关联,用于图表
我基本上读每个推特,读一个词,读是否有关联。如果是,我写下关联(即边)。这是三环。对于中等规模的网络来说,这是非常缓慢的:一个拥有约650个节点和约18000条边的网络在一个2.7GHz的MacMini四核上花费了我将近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()

使用字典。例如,第一步是只读取一次
Names\u Text\u full\u clean.csv
,并将结果存储在字典中,由
match[0]
索引。因为同一个
匹配[0]
可能存在多次,所以需要将可能存在的多个
匹配对象的列表存储为一个值

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
存储在发送方[match[0]]
的列表
中,而是存储
set(match[1:])
。实际上,您只需要查看特定条目(
word[1]
在本例中)是否等于
匹配[1://code>中的任何一项。不用循环来解决这个问题,只需使用my_set中的
word[1]即可


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

您真的要打印结果吗
print“我写了一条记录:它是:”,a
?如果你是的话,你可能应该把它去掉,这肯定会加快事情的发展。当然,布拉德。这只是为了调试目的。谢谢你的评论!Armin,我应用了你建议的更改,引入字典来描述在文件名\u Text\u full\u clean.csv中读取的结果,并替换其中一个循环。我从2天到不到1分钟(相同的数据集)。谢谢!