Search code examples
pythonpython-3.xcsvyamltext-extraction

How to match text in two different file and extract values


So I have two files. One yaml file that contains tibetan words : its meaning. Another csv file that contains only word and it's POStag. As below:

yaml file :

ད་གདོད: ད་གཟོད་དང་དོན་འདྲ།
ད་ཆུ: དངུལ་ཆུ་ཡི་མིང་གཞན།
ད་ཕྲུག: དྭ་ཕྲུག་གི་འབྲི་ཚུལ་གཞན།
ད་བེར: སྒྲིབ་བྱེད་དང་རླུང་འགོག་བྱེད་ཀྱི་གླེགས་བུ་ལེབ་མོའི་མིང་།
ད་མེ་དུམ་མེ: དམ་དུམ་ལ་ལྟོས།

csv file :

ད་ཆུ PART
ད་གདོད DET

Desired output:

ད་ཆུ PART དངུལ་ཆུ་ཡི་མིང་གཞན།
ད་གདོད DET ད་གཟོད་དང་དོན་འདྲ།

Any idea on how to make text match from csv file to yaml file and extract its meaning in csv?


Solution

  • Assuming your files are called dict.yml and input.csv.

    You can start by turning the yaml file into a dictionary with

    import yaml
    
    with open('dict.yaml', 'r') as file:
        trans_dict = yaml.safe_load(file)
    

    Which should give you

    >>> trans_dict
    
    {'ད་གདོད': 'ད་གཟོད་དང་དོན་འདྲ།',
     'ད་ཆུ': 'དངུལ་ཆུ་ཡི་མིང་གཞན།',
     'ད་ཕྲུག': 'དྭ་ཕྲུག་གི་འབྲི་ཚུལ་གཞན།',
     'ད་བེར': 'སྒྲིབ་བྱེད་དང་རླུང་འགོག་བྱེད་ཀྱི་གླེགས་བུ་ལེབ་མོའི་མིང་།',
     'ད་མེ་དུམ་མེ': 'དམ་དུམ་ལ་ལྟོས།'}
    

    Then, you can iterate over the lines in the CSV and use the dictionary to get the definition:

    outputs = []
    with open('text.txt', 'r') as file:
        for line in file:
            term = line.strip()
            definition = trans_dict.get(term.strip())
            outputs.append(
                term if definition is None 
                else f"{term} {definition}"
            )
    

    From here, your outputs variable should contain ['ད་ཆུ དངུལ་ཆུ་ཡི་མིང་གཞན།', 'ད་གདོད ད་གཟོད་དང་དོན་འདྲ།']. If you optionally wanted to write this out to a file, you could do

    with open('output.txt', 'w') as file:
        file.write('\n'.join(outputs))
    

    If you had more tokens on each line of the CSV (unclear from your post), you could iterate over those tokens within a line, but you'd be able to apply basically the same approach.