Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找单词共现_Python_Word Count - Fatal编程技术网

Python 查找单词共现

Python 查找单词共现,python,word-count,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

这就是我的问题。我有一个非常大的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文件!)。我也可能会耗尽内存。有谁能想出更好的方法来做这件事吗。也许将文件导入数据库并运行某种查询?

我认为使用和很容易:

至于处理大型文件,我认为您可以尝试某种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框架。这里是谷歌的第一个链接-。实际上,它有一个演示如何创建和运行一个计算单词的迪斯科工作的工具-我认为它可能对您有用(至少我会去尝试一下:)。还有一个-。

非常感谢!我要试试这个。只有一个问题。当你说MapReduce时,你是说使用多个集群吗?因为我没有访问权限。@user1893354我也不是大型集群的大师,也许我不应该使用map reduce这个词。我的意思是更像流程处理。若并没有足够的内存来加载文件中的所有数据,可以逐行加载,将元组保存到文件中,然后运行另一个程序来计算元组。我认为将这些分割的数据加载到SQL中并在那里计算频率(您可以构建索引以加快处理速度)也很有用,这正是我的想法。我只是想澄清一下。谢谢
with open(r"c:\temp\data1.csv") as r:
    for l in r:
        c[l.rstrip('\n')] += 1