簡體   English   中英

尋找單詞共現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM