
Роман
19.01.2017
04:00:42
а если не секрет, чего делаешь с ней?)
просто мне тоже нужна, но возможно и не нужна :D

IH
19.01.2017
04:01:11

Nikolay
19.01.2017
04:03:50
Привет, питонисты. Есть вопрос:
mseq,morph,_,tag,_,_,mgov,mptst,_,_,deprel = line.split('\t',10)
Вот в этот код иногда приходят не 10 значений, а 11 или 1. В обоих случаях ошибка ValueError. 11 значений я поймал с помощью try: except:
Но когда приходит 1 значение, выпрыгивает ошибка и код завершается. Я хочу продолжить в любом случае, то есть что-нибудь вроде:
try:
mseq,morph,_,tag,_,_,mgov,mptst,_,_,deprel = line.split('\t',10)
except ValueError:
mseq,morph,_,tag,_,_,mgov,mptst,_,deprel = line.split('\t',10)
except:
sys.stderr.write("I can't process this line" + "\n" + line)
pass
Но почему-то ничего не выходит. Есть идеи?
ты чего-то странное делаешь

Google

Nikolay
19.01.2017
04:03:56
бери pandas и все

IH
19.01.2017
04:05:02
бери pandas и все
а зачем городить либы на либах? Если как мне уже подсказали - можно просто проверить строку, до чего я не догадался?

Nikolay
19.01.2017
04:05:18
она за тебя и валидацию сделает, и колонки поназывает
зачем костыли делать?
не говоря уже о том, что на ней будет быстрее в разы работать

IH
19.01.2017
04:05:52
Вот таких предложений, разбитых по синтаксису - 200 мб
В середине примерно, после 100+ эпох начинается валидация, где каждая строка имеет вид типа
14\t단\t_\tJKO\tJKO\t_\t12\tNP_OBJ\t_\t_\tMOD
вот это все нужно валидировать. Но что-то либо в моем коде не так, либо в тренировочном файле не так и иногда выходит
VOD\t_\tMOD
Вот это я и пытался словить

Nikolay
19.01.2017
04:13:11
японский лисп

Google

Alexey
19.01.2017
04:13:30
Эм.. А зачем нейросеть для синтаксического дерева?

IH
19.01.2017
04:13:40

Nikolay
19.01.2017
04:13:49
согласен, корейский
но все равно - AST

IH
19.01.2017
04:14:11

Nikolay
19.01.2017
04:14:45
а какое отношение имеет нейросеть к построению синтаксического дерева?
NLP и марковские модели отменили?
ну ладно, это пофиг
но в итоге ты хочешь парсить выдачу дерева в таком формате, правильно?

IH
19.01.2017
04:15:36

Nikolay
19.01.2017
04:16:15
погоди
давай по порядку, в чем конкретно вопрос? я не вижу никакой связи между строчкой кода выше и тем, что на скриншоте
если тебе нужно избежать ошибки при парсинге строк с разным количеством полей - бери модуль csv и иди по каждой строке отдельно

IH
19.01.2017
04:19:46

Nikolay
19.01.2017
04:21:43
тогда у тебя проблема не в месте, где ты читаешь, а в месте, где генеришь

IH
19.01.2017
04:22:39

Nikolay
19.01.2017
04:23:16
вставь костыль в генераторе, чтобы при таком раскладе использовался другой разделитель
это спасет?

Google

IH
19.01.2017
04:24:26

Boris
19.01.2017
04:24:32
теперь проблемы корейского языка стали твоими проблемами

Nikolay
19.01.2017
04:24:57
ну, ты заранее же не знаешь, какая именно морфема разделилась на две?

IH
19.01.2017
04:25:03

Nikolay
19.01.2017
04:25:09
если ты не знаешь - тогда что ни делай, в итоге будет неверно

IH
19.01.2017
04:25:58

Nikolay
19.01.2017
04:26:07
слушай, ну тогда делай просто генератор для чтения с try except

IH
19.01.2017
04:26:45
слушай, ну тогда делай просто генератор для чтения с try except
Ну вот он:
checkline = line.split('\t')
if len(checkline) >=10:
try:
mseq,morph,_,tag,_,_,mgov,mptst,_,_,deprel = line.split('\t',10)
except ValueError:
mseq,morph,_,tag,_,_,mgov,mptst,_,deprel = line.split('\t',10)
else:
sys.stderr.write("I can't process this line" + "\n" + line)
pass

Nikolay
19.01.2017
04:27:02
ну да, типа того
лучше ты никак не сделаешь, боюсь

IH
19.01.2017
04:27:17
только проблема теперь в том, что нужно весь код вставить в try except, а то ошибка в local variable referenced before assignment

Nikolay
19.01.2017
04:27:31
нет, почему весь?

IH
19.01.2017
04:27:38
нет, почему весь?
было так:
mseq, morph blabla = line.split()
mseq = int(mseq)
кучакода

Pavel
19.01.2017
04:29:27
mseq=morph=tag=mgov=mptst=deprel=None перед первым try?

Nikolay
19.01.2017
04:29:39
def iter_input():
for line in sys.stdin:
fields = line.split('\t', 10)
if len(checkline) == 10:
yield fields
Ну вот он:
checkline = line.split('\t')
if len(checkline) >=10:
try:
mseq,morph,_,tag,_,_,mgov,mptst,_,_,deprel = line.split('\t',10)
except ValueError:
mseq,morph,_,tag,_,_,mgov,mptst,_,deprel = line.split('\t',10)
else:
sys.stderr.write("I can't process this line" + "\n" + line)
pass
тут у тебя тупо неверный код
ты не можешь делать >=, а потом распаковку
в распаковке число всегда строгое

Google

IH
19.01.2017
04:30:12

Nikolay
19.01.2017
04:30:55
и потом, зачем два раза сплитать строку? у тебя же все уже лежит в checkline

Pavel
19.01.2017
04:30:57

Nikolay
19.01.2017
04:31:52
но так, как в твоем примере - неправильно

IH
19.01.2017
04:32:07

Pavel
19.01.2017
04:34:25

Admin
ERROR: S client not available

IH
19.01.2017
04:34:59

Boris
19.01.2017
04:35:33
Ну вот он:
checkline = line.split('\t')
if len(checkline) >=10:
try:
mseq,morph,_,tag,_,_,mgov,mptst,_,_,deprel = line.split('\t',10)
except ValueError:
mseq,morph,_,tag,_,_,mgov,mptst,_,deprel = line.split('\t',10)
else:
sys.stderr.write("I can't process this line" + "\n" + line)
pass
зачем все эти эксепты? так не оч стабильно, вдруг там длина 12 выскочит и все обработается не так как задумано или еще чего. вот вариант:
if len(checkline) == 11:
process_data
elif len(checkline) == 10:
process_data
else:
skip_line

Nikolay
19.01.2017
04:36:25
а как их распаковывать потом - это уже дело другое

IH
19.01.2017
04:42:36
Генератор... Пока попробую по коду выше, если не получится - буду ковырять генератор

Pavel
19.01.2017
04:43:29

Maxim robox
19.01.2017
04:54:11

Nikolay
19.01.2017
04:55:01
да и вообще, зачем tsv разбирать таким макаром?

Maxim robox
19.01.2017
04:55:35

Google

Maxim robox
19.01.2017
04:56:18
Тред не читал. Почему не csv либой?

Nikolay
19.01.2017
04:57:11
я не уверен, что csv.reader не упадет на такой ерунде

Maxim robox
19.01.2017
05:00:37
Не уверен, что csv должен знать количество столбцов.
Заранее

Nikolay
19.01.2017
05:01:50
ну, по большому счету, здесь пофиг, каким модулем сплитать
тут надо именно по колонкам разобрать именованным по определенным правилам

Maxim robox
19.01.2017
05:02:59
Может регэкспом? :3

Nikolay
19.01.2017
05:03:16
не учи плохому)

Maxim robox
19.01.2017
05:05:20
Всё становится лучше с регэкспами. :3

Nikolay
19.01.2017
05:05:48
это только если ты на темной стороне силы
в питоне регэкспы за редким исключением - большое зло))

Maxim robox
19.01.2017
05:06:10
Почему?

Nikolay
19.01.2017
05:07:44
в силу имплементации. Там она приделана сбоку и довольно хреновая по производительности
во многих простых задачах комбинации split() и каких-нибудь startswith() будут в разы быстрее

Alexey
19.01.2017
05:21:43

Nikolay
19.01.2017
05:25:20
есть тесты где посмотреть?
да там оно и так очевидно в простых случаях, вот, например https://stackoverflow.com/questions/4901523/whats-a-faster-operation-re-match-search-or-str-find
проблема еще и в том, что в случае регулярок обычно требуется несколько проходов по строке

Alexey
19.01.2017
05:26:44

Nikolay
19.01.2017
05:27:02
поэтому компилить ее надо руками и самому
самое неудачное, что можно сделать - это генерить в цикле регулярку и по ней тут же искать