Сохраняйте имена собственные и слова с заглавной буквы при построении корней

Я разрабатываю программу обработки текста, и позже мне нужно будет подобрать слова для исследовательского анализа. Один из моих процессов — вычленение слов, и я должен использовать Портера Стеммера.

Я разработал структуру DataFrame для хранения своих данных. Кроме того, я также разработал функцию для применения к DataFrame. Когда я применяю функцию к DataFrame, определение основы работает, но не сохраняет слова с заглавной буквы (или имена собственные).

Фрагмент моего кода:

from nltk.stem.porter import PorterStemmer

def stemming(word):
    stemmer = PorterStemmer()
    word = str(word)
    if word.title():
        stemmer.stem(word).capitalize()
    elif word.isupper():
        stemmer.stem(word).upper()
    else:
        stemmer.stem(word)
    return word

dfBody['body'] = dfBody['body'].apply(lambda x: [stemming(y) for y in x])

Это мой результат без заглавных слов: output

Пример набора данных (мой набор данных очень большой):

file    body
PP3169 ['performing', 'Maker', 'USA', 'computer', 'Conference', 'NIPS']

Ожидаемый результат (после применения функции стемминга):

file    body
PP3169 ['perform', 'Make', 'USA', 'comput', 'Confer', 'NIPS']

Любой совет будет принят с благодарностью!


person Moonshine45    schedule 13.09.2019    source источник
comment
Не могли бы вы поделиться несколькими строками из фрейма данных в качестве небольшого примера/тестовых данных, чтобы мы могли протестировать это? Спасибо.   -  person CypherX    schedule 13.09.2019
comment
не должно быть с word = - т.е. word = stemmer.stem(word).capitalize()   -  person furas    schedule 13.09.2019
comment
@furas, который превращает первую букву каждого слова в заглавную :S   -  person Moonshine45    schedule 13.09.2019
comment
Можете ли вы привести пример ввода и соответствующего вывода, который вы ожидаете, когда вы говорите с заглавной буквы (или имена собственные), это может быть 2 разных случая   -  person oldmonk    schedule 13.09.2019
comment
word.title() преобразует текст в заголовок. Вы должны сравнить if word == word.title(): или проверить if word[0].isupper() and word[1:].islower()   -  person furas    schedule 13.09.2019
comment
@furas, ты можешь добавить это как ответ, я удалил свой   -  person oldmonk    schedule 13.09.2019


Ответы (1)


Во-первых: вы должны присвоить результат word

word = stemmer.stem(word).capitalize()

Во-вторых: word.title() не проверяет, написано ли слово с заглавной буквы, но создает слово с заглавной буквы, поэтому вы должны проверить

if word == word.title():

в итоге

if word[0].isupper() and word[1:].islower():

def stemming(word):
    stemmer = PorterStemmer()
    word = str(word)
    if word == word.title():
        word = stemmer.stem(word).capitalize()
    elif word.isupper():
        word = stemmer.stem(word).upper()
    else:
        word = stemmer.stem(word)
    return word
person furas    schedule 13.09.2019