Страницы

Поиск по вопросам

Показаны сообщения с ярлыком обработка. Показать все сообщения
Показаны сообщения с ярлыком обработка. Показать все сообщения

понедельник, 2 марта 2020 г.

Удаление из строки служебных частей речи(союзы, предлоги частицы, междометия и др.) Python 3

#python #python_3x #строки #обработка #морфология


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

Пример:
Строка до применения: "Однако я так и не смог закончить"
Строка после применения: "я не смог закончить"
    


Ответы

Ответ 1



Если вы хотите удалить избранные части речи из строки, то можно части речи определить [к примеру] используя pymorphy2: import pymorphy2 # $ pip install pymorphy2 def pos(word, morth=pymorphy2.MorphAnalyzer()): "Return a likely part of speech for the *word*.""" return morth.parse(word)[0].tag.POS words = "Однако я так и не смог закончить".split() functors_pos = {'INTJ', 'PRCL', 'CONJ', 'PREP'} # function words print(*[word for word in words if pos(word) not in functors_pos]) # -> я смог закончить Часть речи по одному только слову может быть неверно определена. В частном случае, вы можете просто свой набор слов для удаления поддерживать. Можно разобрать части речи, используя averaged_perceptron_tagger_ru из nltk: import nltk # $ pip install nltk # nltk.download('averaged_perceptron_tagger_ru') words = nltk.word_tokenize("Однако я так и не смог закончить") functors_pos = {'CONJ', 'ADV-PRO', 'CONJ', 'PART'} # function words print(*[word for word, pos in nltk.pos_tag(words, lang='rus') if pos not in functors_pos]) # -> я смог закончить

среда, 5 февраля 2020 г.

Удаление дублирующихся строк в файле

#python #python_3x #файлы #строки #обработка


Есть текстовой файл, в нём 1000 Email-ов, каждый Email с новой строки. Часть из них
повторяются. Необходимо, чтобы на выходе после обработки был файл только с уникальными
Email-ами. Как это реализовать с помощью Python 3?
    


Ответы

Ответ 1



Самый быстрый и простой способ убрать дубликаты из списка - преобразовать его к множеству. Конструктор множества set() принимает любой итерируемый объект, в том числе дескриптор файла. После чего остаётся только преобразовать множество обратно в строку и записать в другой файл: with open('emails.txt') as in_fh, open('deduplicated.txt', 'w') as out_fh: out_fh.write(''.join(set(in_fh)))

Ответ 2



Чтобы напечатать уникальные e-mail, заданные в файлах, указанных в командной строке, или из стандартного ввода: #!/usr/bin/env python import fileinput print("\n".join(set(map(str.strip, fileinput.input())))) Пример: $ dedup emails.txt >uniq-emails.txt или: $ dedup < emails.txt >uniq-emails.txt Код работает даже, если невидимый пробел присутствует/отсутствует в строках. К примеру, последняя строчка в файле может иметь/не иметь новой строки—результат всё равно будет правильным. Наличие set() ведёт к тому, что результат печатается в произвольном порядке, который может меняться от запуска к запуску. Чтобы эмулировать sort -u emails.txt, можно использовать groupby(sorted()): #!/usr/bin/env python import fileinput from itertools import groupby for line, _ in groupby(sorted(map(str.strip, fileinput.input()))): print(line) Использование такое же: ввод читается из файлов или stdin, вывод печатается в stdout. Для случая с e-mail это не нужно, но в общем случае, чтобы напечатать только уникальные строки из больших файлов, которые в памяти не умещаются—аналогLC_ALL=C sort -u < input в Питоне: #!/usr/bin/env python3 import contextlib import heapq import sys from itertools import groupby from tempfile import TemporaryFile from operator import itemgetter def uniq(sorted_items): return map(itemgetter(0), groupby(sorted_items)) sorted_files = [] with contextlib.ExitStack() as stack: # sort lines in batches, write intermediate result to temporary files nbytes = 1 << 15 # read ~nbytes at a time for lines in iter(lambda f=sys.stdin.detach(): f.readlines(nbytes), []): lines.sort() file = stack.enter_context(TemporaryFile('w+b')) #NOTE: file is deleted on exit file.writelines(uniq(lines)) # write sorted unique lines file.seek(0) # rewind, to read later while merging partial results sorted_files.append(file) #NOTE: do not close the temporary file, yet # merge and write results sys.stdout = sys.stdout.detach() # suppress ValueError: underlying buffer has been detached sys.stdout.writelines(uniq(heapq.merge(*sorted_files))) Пример: $ sort-u < emails.txt >uniq-emails.txt В этом случае ввод принимается только со стандартного ввода и строки сравниваются как последовательности байт (предполагается что все строки заканчиваются на символ новой строки). Связанный вопрос: Sorting text file by using Python.

пятница, 24 января 2020 г.

Не работает обработка нажатия Enter с клавиатуры. Обрабатываются только цифры

#java #android #клавиатура #listener #обработка


Находил несколько примеров по этому поводу, где то со switch где то c if, но суть
не в этом, так и так не работает. Обработчик реагирует только на нажатия цифр. Даже
default в switch`e не реагирует. Что я делаю не так? Вот код

edit.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (KeyEvent.ACTION_DOWN == event.getAction()){
                switch (keyCode){
                    case KeyEvent.KEYCODE_ENTER:
                        Log.e("TAG", "Нажат интер");
                        break;
                    case KeyEvent.KEYCODE_2:
                        Log.e("TAG", "Нажато 2");
                        break;
                    case KeyEvent.KEYCODE_E:
                        Log.e("TAG", "Нажато e");
                        break;
                    default: Log.e("TAG", "Нажато что то");
                }
            }
            return false;
        }
    });


Весь обработчик реагирует только на цифры. Нажимаю буквы или какие нибудь другие
символы default не срабатывает, нажимаю цифры кроме 2 - срабатывает. Нажимаю 2 - работает.
Все клавиши перетыкал "Нажато е" не выходит. И интер тоже. Может дело в модели телефона
не знаю, у меня Lenovo S650 Андроид 4.4.2 Api 19. Другого телефона нет для проверки.
    


Ответы

Ответ 1



OnKeyListener работает криво и в основном только как раз для цифр с кейпада, остальные клавиши не воспринимает. Странно при этом, что ентер тоже не работает. В этом случае лучше использовать TextWatcher, как-то так: myTextView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { if (s.subSequence(count-1,count).equals("нужная кнопка")) ...выполнить нужное действие } @Override public void afterTextChanged(Editable s) { } });

пятница, 17 мая 2019 г.

Удаление из строки служебных частей речи(союзы, предлоги частицы, междометия и др.) Python 3

Усердно погуглив, на русском и английском, так и не смог найти библиотеку, которая позволяет удалить из строки абсолютно все служебные части речи, если кто знает подскажите ссылку, буду весьма благодарен.
Пример: Строка до применения: "Однако я так и не смог закончить" Строка после применения: "я не смог закончить"


Ответ

Если вы хотите удалить избранные части речи из строки, то можно части речи определить [к примеру] используя pymorphy2
import pymorphy2 # $ pip install pymorphy2
def pos(word, morth=pymorphy2.MorphAnalyzer()): "Return a likely part of speech for the *word*.""" return morth.parse(word)[0].tag.POS
words = "Однако я так и не смог закончить".split() functors_pos = {'INTJ', 'PRCL', 'CONJ', 'PREP'} # function words print(*[word for word in words if pos(word) not in functors_pos]) # -> я смог закончить
Часть речи по одному только слову может быть неверно определена. В частном случае, вы можете просто свой набор слов для удаления поддерживать.

Можно разобрать части речи, используя averaged_perceptron_tagger_ru из nltk
import nltk # $ pip install nltk # nltk.download('averaged_perceptron_tagger_ru')
words = nltk.word_tokenize("Однако я так и не смог закончить") functors_pos = {'CONJ', 'ADV-PRO', 'CONJ', 'PART'} # function words print(*[word for word, pos in nltk.pos_tag(words, lang='rus') if pos not in functors_pos]) # -> я смог закончить

вторник, 9 апреля 2019 г.

Удаление дублирующихся строк в файле

Есть текстовой файл, в нём 1000 Email-ов, каждый Email с новой строки. Часть из них повторяются. Необходимо, чтобы на выходе после обработки был файл только с уникальными Email-ами. Как это реализовать с помощью Python 3?


Ответ

Самый быстрый и простой способ убрать дубликаты из списка - преобразовать его к множеству. Конструктор множества set() принимает любой итерируемый объект, в том числе дескриптор файла. После чего остаётся только преобразовать множество обратно в строку и записать в другой файл:
with open('emails.txt') as in_fh, open('deduplicated.txt', 'w') as out_fh: out_fh.write(''.join(set(in_fh)))