#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.