![](/img/trans.png)
[英]Finding the co-occurrences in the columns of a dataframe given two lists?
[英]Finding word co-occurrences
所以這是我的問題。 我有一個非常大的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文件!)。 我也可能用完了記憶。 任何人都可以想到更好的方法來做到這一點。 也許將文件導入數據庫並運行某種查詢?
我認為使用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框架 。 實際上它有一個教程 ,顯示如何創建和運行一個計算單詞的Disco作業 - 我認為它對你有用(至少我會去嘗試:))。 另一個 - https://github.com/michaelfairley/mincemeatpy 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.