寻找单词共现

时间:2013-09-14 19:06:33

标签: python word-count

所以这是我的问题。我有一个非常大的csv文件,有3列。第一列是唯一的ID。第二列是一个英文句子的字符串。第三列是一串字标签,用于描述第二列中的句子(通常为3个标签,最多为5个)。这是一个例子。

id | sentence                       | tags
1  | "people walk dogs in the park" | "pet park health"
2  | "I am allergic to dogs"        | "allergies health"

我想要做的是找到所有与句子中的单词相关的标记词。因此,上述示例的所需输出看起来像。

("walk","pet"),1
("health","dogs"),2
("allergies","dogs"),1
etc...

其中第一个条目是一个单词对(句子中的第一个,第二个是标记单词),然后是它们共同出现的次数。

我想知道最好的办法是什么。我想也许我可以想出一个python字典,其中键是一个标记词,值是那个标记词出现的id组。我可以对所有句子中出现的所有单词做同样的事情(删除停用词之后)。然后,我可以计算两个单词的每个组合的两个集合中的id的数量,这将给出我们共同出现的次数。

然而,这似乎需要很长时间(巨大的csv文件!)。我也可能用完了记忆。任何人都可以想到更好的方法来做到这一点。也许将文件导入数据库并运行某种查询?

1 个答案:

答案 0 :(得分:6)

我认为使用itertools.product()collections.Counter()很容易:

import csv
from itertools import product
from collections import Counter

rdr = csv.reader(open(r"data.csv"), quotechar='"',delimiter='|')
c = Counter((x, y) for _, a, b in rdr for x, y in product(a.split(), b.split()))

至于处理大文件,我认为你可以尝试某种map-reduce - 逐行读取csv并将所有组合保存到另一个文件中:

with open(r"data.csv") as r, open(r"data1.csv", "w") as w:
    rdr = csv.reader(r, quotechar='"', delimiter='|')
    for _, a, b in rdr:
        for x, y in product(a.split(), b.split()):
            w.write("{},{}\n".format(x, y))

下一步是读取第二个文件并创建计数器:

with open(r"c:\temp\data1.csv") as r:
    for l in r:
        c[l.rstrip('\n')] += 1

更新我开始看到有没有适用于Python的map-reduce框架。这是googling的第一个链接 - Disco map-reduce framework。实际上它有一个tutorial,它显示了如何创建和运行一个计算单词的Disco作业 - 我认为它对你有用(至少我会试一试:))。另一个 - https://github.com/michaelfairley/mincemeatpy