Проблема с использованием пространства для лемматизации текста и преобразования в CSV

#python #csv #anaconda #spacy

Вопрос:

Я использую Anaconda и хочу лемматизировать, маркировать и морфологически аннотировать текст с помощью spacy. У меня есть текстовый файл, который я хочу преобразовать в CSV-файл со всеми аннотациями и т.д., Используя следующий скрипт:

 import os
import re
import csv
import glob
from collections import Counter
nlp = spacy.load("de_core_news_md")
plaintextfolder = "" #here would be my file path
taggedfolder = "" #here would be my file path
language = "de"
doc = nlp("Dies ist ein Satz.")
for token in doc:
    print(token.text,token.pos_,token.lemma_,token.morph)

nlp = spacy.load("de_core_news_md")

def read_plaintext(file):
    with open(file, "r", encoding="utf-8") as infile:
        text = infile.read()
        text = re.sub("’", "'", text)
        return text 
        
def save_tagged(taggedfolder, filename, tagged):
    taggedfilename = taggedfolder   "/"   filename   ".csv"
    with open(taggedfilename, "w", encoding="utf-8") as outfile:
        writer = csv.writer(outfile, delimiter='t')
        for token in tagged:
            token = token.text,token.pos_,token.lemma_,token.morph
            writer.writerow(token)      
            
def main(plaintextfolder, taggedfolder, language):
    print("n--preprocess")
    if not os.path.exists(taggedfolder):
        os.makedirs(taggedfolder)
    counter = 0
    for file in glob.glob(plaintextfolder   "*.txt"):
        filename, ext = os.path.basename(file).split(".")
        counter  =1
        print("next: file", counter, ":", filename)
        text = read_plaintext(file)
        tagged = nlp(text)
        save_tagged(taggedfolder, filename, tagged)

main(plaintextfolder, taggedfolder, language)
 

То, что я хотел бы иметь в конце, — это CSV-файл, выглядящий так:

 Dies PRON Dies Case=Nom|Gender=Neut|Number=Sing|PronType=Dem
ist AUX sein Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin
ein DET einen Case=Nom|Definite=Ind|Gender=Masc|Number=Sing|PronType=Art
Satz NOUN Satz Case=Nom|Gender=Masc|Number=Sing
 

Но я получаю только странный CSV-файл, выглядящий так (я скопировал только первые строки):

 "'  PUNCT   '   "

"D'i'e's    X   D'i'e's Foreign=Yes"

"'  PUNCT   '   "

"'  PUNCT   '   "

"i's't  X   i's't   Foreign=Yes"

"'  PUNCT   '   "
 

Если бы вы могли помочь мне с этим вопросом, я был бы вам очень признателен!

Комментарии:

1. Привет, не могли бы вы привести исходную строку из входного файла, пожалуйста.

Ответ №1:

Поэтому в качестве общего замечания, задавая вопрос о StackOverflow, вы должны свести свою проблему к минимуму, а в вашем примере кода слишком много всего происходит. Тем не менее…

Я не могу точно воспроизвести вашу проблему, но я могу получить ее часть. Мне удалось получить несколько странных строк, похожих на ваши, если бы я не позвонил .strip() по тексту. Поэтому вам нужно убедиться, что вы не передаете новые строки в CSV — файл-он неправильно их экранирует. Например, если мой входной файл содержит «Das ist gut», вывод выглядит следующим образом:

 Das PRON    der Case=Nom|Gender=Neut|Number=Sing|PronType=Dem
ist AUX sein    Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin
gut ADV gut Degree=Pos
"
"   SPACE   "
"   Case=Nom|Gender=Masc|Number=Sing
 

Это выглядит неправильно, но происходит то, что четвертая строка просто включает n внутренние кавычки. В пятой строке указана заключительная цитата, а затем начальная цитата для другой новой строки, указанной в кавычках.

Возможно, вы сможете изменить настройки новой строки в csvwriter, чтобы исправить это, но, вероятно, проще просто удалить новые строки.

Для ваших токенов , например D'i'e's , это выглядит так, как будто либо ваш вводный текст был плохим, либо что-то пошло не так с вашим регулярным выражением для кавычек, хотя в текущей форме это выглядит нормально.

В любом случае, чтобы понять, что происходит не так, я предлагаю вам отладить свой код шаг за шагом, чтобы понять, какой текст вы читаете и каков ввод в csvwriter.