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