Python 提取多个列表中的公共元素

Python 提取多个列表中的公共元素,python,tf-idf,text-analysis,Python,Tf Idf,Text Analysis,一般来说,我想做的是提取几个csv文件中“word”的共享列中的公共元素。(2008.csv、2009.csv、2010.csv……2015.csv) 所有文件的格式都相同:“word”、“count” “word”包含特定年份一个文档中的所有常用词 以下是其中一个文件的快照: 只要8个文件中有两个文件具有公共元素,我就想知道这些共享元素以及它们所在的文件。(这很像tfidf计算……顺便说一句) 无论如何,我的目标是了解这些文件中频繁出现的单词的一些趋势。 (据我所知,一个元素最多可以包

一般来说,我想做的是提取几个csv文件中“word”的共享列中的公共元素。(2008.csv、2009.csv、2010.csv……2015.csv)


所有文件的格式都相同:“word”、“count”

“word”包含特定年份一个文档中的所有常用词


以下是其中一个文件的快照:


只要8个文件中有两个文件具有公共元素,我就想知道这些共享元素以及它们所在的文件。(这很像tfidf计算……顺便说一句)

无论如何,我的目标是了解这些文件中频繁出现的单词的一些趋势。 (据我所知,一个元素最多可以包含在五个文件中。)

我想知道单词第一次出现的时间,也就是说,一个单词出现在文件C中,但不同时出现在文件B和a中

我知道for+if可能会解决这里的问题,但它相当乏味,我需要比较8个中的2个,8个中的3个,8个中的4个。。。列来查找共享元素

这是我到目前为止制定的代码。。。远离我需要的。。。我只是比较了8个文件中的两个文件中的元素:


有人能帮忙吗?

使用set
交叉口
可能会有帮助

for i in range(len(year_list)):
    datai=set(pd.read_csv('filename_'+year_list[i]+'.csv')['word'])
    tocompare=[]
    for j in range(i+1,len(year_list)):
        dataj=set(pd.read_csv('filename_'+year_list[j]+'.csv')['word'])
        print "Two files:",i,j
        print datai.intersection(dataj)
        tocompare.append(dataj)
    print "All compare:"
    print datai.intersection(*tocompare)
    break

第一个答案大体上很有效。但是由于某些原因,交集函数并没有返回我期望的精确结果。所以我修改了提供的代码,以提高打印输出的准确性和格式

for i in range(0,8):
otheryears = []
if i>0:
    for y in range(0,i):
        datay = set(pd.read_csv("most_50_common_words_"+year_list[y]+'.csv')["word"])
        for y in list(datay):
            if y not in otheryears:
                otheryears.append(y)     
uniquei = []
datai = set(pd.read_csv("most_50_common_words_"+year_list[i]+'.csv')["word"])
print "\nCompare year %d with:\n" % int(year_list[i])
for j in range(i+1,8):
    dataj = set(pd.read_csv("most_50_common_words_"+year_list[j]+'.csv')['word'])
    print year_list[j],':'
    listj = list(datai.intersection(dataj))
    print list(datai.intersection(dataj)),'\n',"%d common words with year %d" % (len(datai.intersection(dataj)),int(year_list[j]))
    for j in list(dataj):
        if j not in otheryears:
            otheryears.append(j)

common = []
for x in list(datai):
    if x in otheryears:
        common.append(x)   
print "\nAll compare:"
print "%d year has %d words in common with other years. They are as follows:\n%s" % (int(year_list[i]),
                                                                                     len(common),common),'\n'
for x in list(datai):
    if x not in otheryears:
        uniquei.append(x)
print "%d Frequent words unique in year %d:\n%s \n" % (len(uniquei),int(year_list[i]),uniquei)

您忘记发布到目前为止的代码。请在问题中提供相关信息。链接可以删除,我们在这里帮助您。如果你能让它变得简单,我们将不胜感激。这像TFxIDF吗?你有DF文件,但它到此为止。请不要发布图像。我们需要能够复制/粘贴代码和数据。我想知道每个单词的tfidf值,同时知道单词出现的文件数(年)和文件数(年)。。。这样我就可以知道什么词可以成为哪一年的关键词,并跟踪关键词的发展趋势。事实上,这些话都是从IBM网站上爬出来的,都是关于云计算的。谢谢!但这种方法仍然局限于比较两年(或文件)的关键词。是否在所有八个文件之间进行比较?
intersection
方法可以接受多个参数!因此,您只需要读取其他文件,并将它们全部放入该方法,就像:
datai.intersection(dataj、datak、datam…)
代码仍然存在一些问题。。代码中的“所有比较”可以向前进行,这意味着2012年可以与2013年到2015年的合并数据进行比较,但不能与2011年的合并数据进行比较。当我试图在某一年中找到独特的单词时,这会造成问题。例如,2011年而非2013年出现的词语将被视为2012年的唯一词语。是的。如果你想得到唯一的单词,你可以在普通单词中检查它。这取决于你的需要。您最好使用
set
set.add
,而不是
列表
列表。append
。后者比较慢。我只是在做比较时添加了另一个for循环函数来添加往年的数据。。。代码工作,但相当长的时间。。。我应该试一试布景。也许加上