Как быстро проверить правильность английских слов в строках?- питон - PullRequest
0 голосов
/ 25 мая 2018

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

Вопрос в том, что является самым быстрым способом сохранить только правильные английские слова для каждой ячейки?

Ниже приведен мой первоначальный метод, который, по-видимому, занял бы несколько дней, исходя из скорости, предложенной из tqdm.(следовательно, progress_apply).

import pandas as pd
from nltk.corpus import words
from tqdm import tqdm

def check_for_word(sentence):
    s = sentence.split(' ')
    for word in s:
        if word not in words.words():
            s.remove(word)
    return ' '.join(s)

tqdm.pandas(desc="Checking for Words in keywords")
df['keywords'] = df['keywords'].progress_apply(check_for_word)  

Есть ли способ, который был бы значительно быстрее?

Спасибо за вашу помощь!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Ответ ниже был очень полезным и занял меньше секунды (БОЛЬШОЕ УЛУЧШЕНИЕ!).В конце концов, мне пришлось изменить слова nltk.corpus на wordl nltk.corpus, поскольку слова не были исчерпывающим списком для моих целей.Окончательный результат был:

from nltk.corpus import wordnet
from tqdm import tqdm

def check_for_word(s):
    return ' '.join(w for w in str(s).split(' ') if len(wordnet.synsets(w)) > 0)

tqdm.pandas(desc="Checking for Words in Keywords")
df['keywords'] = df['keywords'].progress_apply(check_for_word)

, что заняло 43 секунды для запуска.

1 Ответ

0 голосов
/ 25 мая 2018

words.words() возвращает список, который занимает O(n) время для проверки наличия слова в списке или нет.Чтобы оптимизировать сложность времени, вы можете создать набор из этого списка, который предлагает поиск с постоянным временем.
Вторая оптимизация заключается в том, что метод remove() в списке занимает O(n) время.Вы можете сохранить отдельный список, чтобы удалить эти накладные расходы.Чтобы узнать больше о сложности различных операций, вы можете обратиться к https://www.ics.uci.edu/~pattis/ICS-33/lectures/complexitypython.txt

set_of_words = set(words.words())

def check_for_word(sentence):
    s = sentence.split(' ')
    return ' '.join(w for word in s if word in set_of_words)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...