Оптимизация кода определения языка и лемматизация в Python

У меня есть данные отзывов пользователей Amazon в формате JSON, которые я импортирую в фреймворк данных pandas и использую его для обучения модели для классификации текста. Я пытаюсь предварительно обработать текст отзыва пользователя перед обучением модели с этими данными. У меня тут два вопроса:

1) Я написал код для определения его языка, используя библиотеку Textblob в Python, которая работает нормально, но требует много времени. Скажите, пожалуйста, может ли быть оптимальный подход. Я использую библиотеку Textblob в python, и код:

    from textblob import TextBlob
    def detect_language(text):
        if len(text)>3:
            r=TextBlob(text)
            lang = r.detect_language()
            return lang
    dataset['language']=dataset.reviewText.apply(lambda x: detect_language(x))

2) Я хочу лемматизировать свои слова перед обучением модели. Но поскольку лемматизация в NLTK будет работать правильно, если у нас есть части речи, помеченные словами, я пытаюсь сделать это следующим образом, но получаю некоторую ошибку:

    from nltk import pos_tag
    from nltk.stem import WordNetLemmatizer
    text='my name is shubham'
    text=pos_tag(text.split())
    wl=WordNetLemmatizer()
    for i in text:
        print(wl.lemmatize(i))

Здесь я получаю сообщения, помеченные как:

    [('my', 'PRP$'), ('name', 'NN'), ('is', 'VBZ'), ('shubham', 'JJ')]

и при выполнении лемматизации я получаю сообщение об ошибке:

    AttributeError: 'tuple' object has no attribute 'endswith'

Не могли бы вы предложить эффективный способ выполнения лемматизации. Вот мои примеры данных, на которых я выполняю определение языка и лемматизацию:

    overall reviewText
        5   Not much to write about here, but it does exac...
        5   The product does exactly as it should and is q...
        5   The primary job of this device is to block the...
        5   Nice windscreen protects my MXL mic and preven...
        5   This pop filter is great. It looks and perform...

person Shubham Singh    schedule 07.02.2018    source источник
comment
Нужна дополнительная информация об ошибке msg. Какая строка вызывает это, и если это происходит, когда wl.lemmeatize, то перед этим напечатайте i.   -  person gout    schedule 07.02.2018
comment
@gout я получаю сообщение об ошибке print(wl.lemmatize(i)). Я попытался напечатать i и узнал, что он выдает ошибку для самого первого слова, то есть («мой», «PRP $»).   -  person Shubham Singh    schedule 07.02.2018
comment
Взгляните на kaggle.com/alvations/basic-nlp-with-nltk и gist.github.com/alvations/07758d02412d928414bb   -  person alvas    schedule 08.02.2018
comment
@alvas Теперь я могу это сделать. Спасибо.   -  person Shubham Singh    schedule 08.02.2018


Ответы (1)


TL;DR

from nltk import pos_tag, word_tokenize
from nltk.stem import WordNetLemmatizer

wnl = WordNetLemmatizer()

def penn2morphy(penntag):
    """ Converts Penn Treebank tags to WordNet. """
    morphy_tag = {'NN':'n', 'JJ':'a',
                  'VB':'v', 'RB':'r'}
    try:
        return morphy_tag[penntag[:2]]
    except:
        return 'n' 

def lemmatize_sent(text): 
    # Text input is string, returns lowercased strings.
    return [wnl.lemmatize(word.lower(), pos=penn2morphy(tag)) 
            for word, tag in pos_tag(word_tokenize(text))]

Чтобы лемматизировать столбец dataframe строки.

df['lemmas'] = df['text'].apply(lemmatize_sent)

В длинном

Прочтите https://www.kaggle.com/alvations/basic-nlp-with-nltk

person alvas    schedule 08.02.2018