Предоставление извлеченной леммы для каждого предложения с помощью treetaggerwrapper не работает: возвращает список слов вместо списка слов для каждого предложения

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

Код для функции лемматизации

tagger = treetaggerwrapper.TreeTagger(TAGLANG='fr') 
def lemmatize(corpus):
    lemmatize_list_of _sentences= []
    lemmatize_list_of _sentences2 = []
    for sentence in corpus:
        tags = tagger.tag_text(sentence)
        tags2 = treetaggerwrapper.make_tags(tags, allow_extra = True)
        lemmatize_list_of_sentences.append(tags2)
        print(lemmatize_list_of_sentences)
        for subl in lemmatize_list_of_sentences: # loop in list of sublists 
            for word in subl:
                if word.__class__.__name__ == "Tag":
                    lemme=word[2] #  I want also to check if lemme[2] is empty and add this 
                    lemmeOption2=lemme.split("|")
                    lemme=lemmeOption1[0]
                    lemmatize_list_of_sentences2.append(lemme)


    return lemmatize_list_of_sentences2 # should return a list of lists where each list contains the lemme retrieve



lemmatize_train= lemmatize(sentences_train_remove_stop_words)
lemmatize_test= lemmatize(sentences_test_remove_stop_words)
print(lemmatize_train)

Кроме того, я хотел бы добавить функцию лемматизации в строку кода, чтобы проверить, пуст ли индекс (2) или (-1), и, если он пуст, получить слово по первому индексу.

Я придумал это, но как я могу совместить это с моей функцией лемматизации

for word in subl:
        lemme= word.split('\t')
        try:
            if lemme[2] == '':
                lemmatize_list_of _sentences2.append(parts[0])
            else:
                lemmatize_list_of _sentences2.append(parts[2])
        except:
            print(parts)

список предложений в file_input

La période de rotation de la Lune est la même que sa période orbitale et elle présente donc toujours le même hémisphère. 
Cette rotation synchrone résulte des frottements qu’ont entraînés les marées causées par la Terre. 

После добавления тегов к тексту и распечатки списка предложений_tagging у меня есть следующее:

первое предложение:

[[Tag(word='la', pos='DET:ART', lemma='le'), Tag(word='période', pos='NOM', lemma='période'), Tag(word='rotation', pos='NOM', lemma='rotation'), Tag(word='lune', pos='NOM', lemma='lune'), Tag(word='période', pos='NOM', lemma='période'), Tag(word='orbitale', pos='ADJ', lemma='orbital'), Tag(word='présente', pos='VER:pres', lemma='présenter'), Tag(word='donc', pos='ADV', lemma='donc'), Tag(word='toujours', pos='ADV', lemma='toujours')]]

целые предложения:

[[Tag(word='la', pos='DET:ART', lemma='le'), Tag(word='période', pos='NOM', lemma='période'), Tag(word='rotation', pos='NOM', lemma='rotation'), Tag(word='lune', pos='NOM', lemma='lune'), Tag(word='période', pos='NOM', lemma='période'), Tag(word='orbitale', pos='ADJ', lemma='orbital'), Tag(word='présente', pos='VER:pres', lemma='présenter'), Tag(word='donc', pos='ADV', lemma='donc'), Tag(word='toujours', pos='ADV', lemma='toujours')], [Tag(word='cette', pos='PRO:DEM', lemma='ce'), Tag(word='rotation', pos='NOM', lemma='rotation'), Tag(word='synchrone', pos='ADJ', lemma='synchrone'), Tag(word='résulte', pos='VER:pres', lemma='résulter'), Tag(word='frottements', pos='NOM', lemma='frottement'), Tag(word='entraînés', pos='VER:pper', lemma='entraîner'), Tag(word='les', pos='DET:ART', lemma='le'), Tag(word='marées', pos='NOM', lemma='marée'), Tag(word='causées', pos='VER:pper', lemma='causer')]]

После получения леммы у меня есть список слов, чего я не ожидал. Ожидается список для каждого предложения.

Выход :

['le', 'période', 'rotation', 'lune', 'période', 'orbital', 'présenter', 'donc', 'toujours', 'ce', 'rotation', 'synchrone', 'résulter', 'frottement', 'entraîner', 'le', 'marée', 'causer']

Ожидается: каждое слово предложения должно состоять из одной строки с пробелами между словами.


['le période rotation lune période orbital présenter donc toujours','ce rotation synchrone résulter frottement entraîner le marée causer']


person kely789456123    schedule 06.06.2019    source источник
comment
Кажется, что ваш список заполнен объектами Tag. Вместо того, чтобы проверять наличие пустых мест в подсписке, вы можете проверить, имеет ли элемент в списке тип Tag с функцией isinstance (переменная, класс). После проверки вы можете попробовать проверить, является ли атрибут пустым, с помощью (variable.word ==). Также учтите, что лемматизаторы работают на основе слов, а не словосочетаний - поэтому все они разделены. Попробуйте объединить их с помощью .join (listname).   -  person Tiago Duque    schedule 06.06.2019
comment
@Tiago Duque, спасибо, но как я могу написать строку, чтобы проверить, пуста ли переменная внутри класса: if word .__ class __.__ name__ == Tag: variable = lemme = word [2] if variable ==: lemme = word [ 0] else: lemme = word [2] lemmeOption1 = lemme.split (|) lemme = lemmeOption1 [0] #print (lemme) lemmatize_list_of_sentences2.append ('' .join (lemme))   -  person kely789456123    schedule 06.06.2019
comment
Посмотрите на код здесь: pastebin.com/TDXHJQ4B и посмотрите, подходит ли он для вашего случая.   -  person Tiago Duque    schedule 06.06.2019
comment
Имейте это: if isinstance (word, Tag): NameError: имя 'Tag' не определено   -  person kely789456123    schedule 07.06.2019
comment
Имейте это: if isinstance (word, Tag): NameError: name 'Тег' не определен, но когда я использую это, он работает: если word .__ class __.__ name__ == Tag:, моя проблема по-прежнему заключается в списке слов, как Могу ли я получить список для каждого предложения, а не для всех предложений вместе.   -  person kely789456123    schedule 07.06.2019
comment
Хорошо, теперь я понял вашу проблему. Я скоро отправлю ответ.   -  person Tiago Duque    schedule 07.06.2019
comment
Давайте продолжим это обсуждение в чате.   -  person Tiago Duque    schedule 07.06.2019


Ответы (1)


Итак, вы хотите иметь два списка тегов.

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

tagger = treetaggerwrapper.TreeTagger(TAGLANG='fr') 
def lemmatize(corpus):
    lemmatize_list_of_sentences= []
    lemmatize_list_of_sentences2 = []
    for sentence in corpus:
        tags = tagger.tag_text(sentence)
        tags2 = treetaggerwrapper.make_tags(tags, allow_extra = True)
        lemmatize_list_of_sentences.append(tags2)
        print(lemmatize_list_of_sentences)
        for subl in lemmatize_list_of_sentences: # loop in list of sublists
            #Here you create a list to work as a "inner" sentence list.
            sentence_lemmas = []
            for word in subl:
                if word.__class__.__name__ == "Tag":
                    lemme=word[2] #  I want also to check if lemme[2] is empty and add this 
                    lemmeOption2=lemme.split("|")
                    lemme=lemmeOption2[0] #There was a typo here
                    sentence_lemmas.append(lemme) #Here you append the lemma extracted
            # Here you change the original list in order for it to receive the "inner" list.
            lemmatize_list_of_sentences2.append(sentence_lemmas)


    return lemmatize_list_of_sentences2 # should return a list of lists where each list contains the lemme retrieve



lemmatize_train= lemmatize(sentences_train_remove_stop_words)
lemmatize_test= lemmatize(sentences_test_remove_stop_words)
print(lemmatize_train)

Проверка пустого ли тега

Кроме того, из документации (документы оболочки тегов дерева) "Тег" представляет собой "именованный кортеж ".

Вы можете узнать больше об «именованных кортежах» в этом сообщении.

Но, по сути, вы можете ссылаться на атрибуты «Tag» так же, как и на объекты, подав в суд на. (точечная) запись.

Итак, чтобы проверить, пуста ли лемма, вы можете:

if word.lemma != "":
   lemme = word.lemma
else:
   lemme = word.word.split("/")

Присоединение к спискам

Кроме того, если вы хотите снова присоединиться к списку лемм в конце, выполните:

joined_sentences = []
for lemma_list in lemmatize_train:
   joined_sentences.append(" ".join(lemma_list))

print(joined_sentences)

Функция, возвращающая соединенные строки:

def lemmatize(corpus):
        lemmatize_list_of_sentences= []
        lemmatize_list_of_sentences2 = []
        for sentence in corpus:
            tags = tagger.tag_text(sentence)
            tags2 = treetaggerwrapper.make_tags(tags, allow_extra = True)
        lemmatize_list_of_sentences.append(tags2)
        print(lemmatize_list_of_sentences)
        for subl in lemmatize_list_of_sentences: # loop in list of sublists
            #Here you create a list to work as a "inner" sentence list.
            sentence_lemmas = []
            for word in subl:
                if word.__class__.__name__ == "Tag":
                    lemme=word[2] #  I want also to check if lemme[2] is empty and add this 
                    lemmeOption2=lemme.split("|")
                    lemme=lemmeOption2[0] #There was a typo here
                    sentence_lemmas.append(lemme) #Here you append the lemma extracted

            lemmatize_list_of_sentences2.append(sentence_lemmas)
    joined_sentences= []
    for lemma_list in lemmatize_list_of_sentences2:
       joined_sentences.append(" ".join(lemma_list))
    return joined_sentences

Надеюсь, теперь это ясно.

person Tiago Duque    schedule 07.06.2019
comment
спасибо, но у меня все еще есть список предложений, а не список предложений, содержащих только лемму. - person kely789456123; 07.06.2019
comment
Итак, вы хотите: [это лемматизированная строка, это еще одна]? Последняя часть ответа делает это. Вы можете добавить этот блок перед выводом (изменением переменной) в функции без проблем. - person Tiago Duque; 07.06.2019
comment
функция возвращает список строк из всех предложений, но проблема в том, что вначале я смотрю на одно предложение после каждого предложения, поэтому логический ответ должен быть строкой всех лемм для каждого предложения, проходящего через мою функцию. например, у меня есть: list = [я сплю, он так занят], окончательный список должен выглядеть так: list = [спать, быть таким занятым] not list = [быть, спать, быть, так, занятым], последний - то, что печатает ваш код. - person kely789456123; 09.06.2019
comment
Это то, что делает часть ответа со списками присоединения. Я изменил функцию, чтобы она возвращала список списков лемм. Затем я дал вам способ превратить каждый внутренний список в строку в списке. В любом случае, я изменю ответ, чтобы у вас была последняя функция со списком лемматизированных строк. - person Tiago Duque; 10.06.2019