簡體   English   中英

如何從 CSV 文件創建字典

[英]How to create a dictionary from a CSV file

我有一個像這樣的 CSV 文件:

          w                                                syn
0     abaca   http://kaiko.getalp.org/dbnary/fra/Musa_textilis
1     abaca  http://kaiko.getalp.org/dbnary/fra/chanvre_de_...
2     abaca           http://kaiko.getalp.org/dbnary/fra/tagal
3     abaca   http://kaiko.getalp.org/dbnary/fra/Musa_textilis
4     abaca  http://kaiko.getalp.org/dbnary/fra/chanvre_de_...
..      ...                                                ...
95  abandon       http://kaiko.getalp.org/dbnary/fra/apostasie
96  abandon    http://kaiko.getalp.org/dbnary/fra/capitulation
97  abandon  http://kaiko.getalp.org/dbnary/fra/cession_de_...
98  abandon       http://kaiko.getalp.org/dbnary/fra/confiance
99  abandon       http://kaiko.getalp.org/dbnary/fra/défection

[100 rows x 2 columns]
6
{'abaca': 'tagal', 'abdomen': 'ventre', 'abricot': 'michemis', 'ADN': 'acide désoxyribonucléique', 'Indien': 'sauvage', 'abandon': 'défection'}

我試圖創建一個字典,其中每個單詞及其同義詞。 我想出了這段代碼,但最終的字典只包含該詞的一個同義詞,但正如您在 csv 文件中看到的那樣,一個詞可以有多個同義詞。

# read specific columns of csv file using Pandas

df = pd.read_csv("sparql.csv", usecols = ["w","syn"]) #usecols = ["l","f","s","w","syn","synonyme"]
print(df)
liste_mot = df['w'].tolist()
liste_mot = set(liste_mot)
print(len(liste_mot))


liste_sys = []
dict_syn = {}


for index, row in df.iterrows():
    k, v = row
    sys = os.path.basename(v)
    if "_" in sys:
        sys = sys.split("_")
        sys = " ".join(sys)
        dict_syn[k] = sys
    else:
        dict_syn[k] = sys

print(dict_syn)

我想要得到的是每個單詞作為關鍵字,並將所有同義詞列表作為其值,但到目前為止,每個單詞(w)我只能得到一個同義詞(syn),而不是所有同義詞。

這是一個部分基於您的代碼的工作示例。 同義詞放在一個列表中:

from io import StringIO

import pandas as pd


text = """
          w                                                syn
0     abaca   http://kaiko.getalp.org/dbnary/fra/Musa_textilis
1     abaca  http://kaiko.getalp.org/dbnary/fra/chanvre_de_...
2     abaca           http://kaiko.getalp.org/dbnary/fra/tagal
3     abaca   http://kaiko.getalp.org/dbnary/fra/Musa_textilis
4     abaca  http://kaiko.getalp.org/dbnary/fra/chanvre_de_...
95  abandon       http://kaiko.getalp.org/dbnary/fra/apostasie
95  abandon       http://kaiko.getalp.org/dbnary/fra/apostasie
96  abandon    http://kaiko.getalp.org/dbnary/fra/capitulation
97  abandon  http://kaiko.getalp.org/dbnary/fra/cession_de_...
98  abandon       http://kaiko.getalp.org/dbnary/fra/confiance
99  abandon       http://kaiko.getalp.org/dbnary/fra/défection
"""

# read in data
df = pd.read_csv(StringIO(text), sep='\s+')

# get the synonym out of the url
df['real_syn'] = df['syn'].str.extract('.*/(.*)')

# dictionary to write results to
result = {}

# loop over every row of the dataframe
for _, row in df[['w', 'real_syn']].iterrows():
    word = row['w']
    syn = row['real_syn']
   
    # check if word is already in result dictionary and make sure words are not added twice
    if result.get(word) and syn not in result[word]:
            result[word] = result[word] + [syn]
    else:
        # if word is not yet in dictionary, then add it a key, and add the synonym as a list
        result[word] = [syn] 
        
print(result)

我不確定您的 CSV 是否實際上是固定寬度的,或者這只是一個不錯的打印輸出。

如果您不需要 Pandas,Python 的標准 CSV 模塊就可以勝任。

import csv
import os
import pprint

from collections import defaultdict

def syn_splitter(s):
    syn = os.path.basename(s)
    syn = syn.replace('_', ' ')
    return syn

# So we can just start appending syns, without having to "prime" the dictionary with an empty list
word_syn_map = defaultdict(list)

with open('sample.csv', 'r', newline='') as f:
    reader = csv.reader(f)
    next(reader)  # discard header

    for row in reader:
        w, syn = row
        syn = syn_splitter(syn)
        word_syn_map[w].append(syn)

pprint.pprint(word_syn_map)

# word_syn_map = dict(word_syn_map) if you want to get rid of the defaultdict wrapper

我模擬了sample.csv

w,syn
abaca,http://kaiko.getalp.org/dbnary/fra/Musa_textilis
abaca,http://kaiko.getalp.org/dbnary/fra/tagal
abaca,http://kaiko.getalp.org/dbnary/fra/Musa_textilis
abandon,http://kaiko.getalp.org/dbnary/fra/apostasie
abandon,http://kaiko.getalp.org/dbnary/fra/capitulation
abandon,http://kaiko.getalp.org/dbnary/fra/confiance
abandon,http://kaiko.getalp.org/dbnary/fra/défection

我得到了:

defaultdict(<class 'list'>,
            {'abaca': ['Musa textilis', 'tagal', 'Musa textilis'],
             'abandon': ['apostasie',
                         'capitulation',
                         'confiance',
                         'défection']})

另一種方法:

import os

df = pd.read_csv("sparql.csv", usecols=["w","syn"])
df["syn_new"] = df.syn.map(os.path.basename).str.replace("_", " ")
dict_syn = {
    key: group.syn_new.to_list()
    for key, group in df[["w", "syn_new"]].groupby("w")
}

您的樣品的結果:

{'abaca': ['Musa textilis',
           'chanvre de ...',
           'tagal',
           'Musa textilis',
           'chanvre de ...'],
 'abandon': ['apostasie',
             'capitulation',
             'cession de ...',
             'confiance',
             'défection']}

你可以試試如果

df["syn_new"] = df.syn.str.rsplit("/", 1, expand=True)[1].str.replace("_", " ")

也可以,可能會更快。

也許您不想要list s 而是set s setdict_syn值以避免重復:

...
    key: set(group.syn_new.to_list())
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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