Разделить предложения, обработать слова и соединить предложение? - PullRequest
0 голосов
/ 30 марта 2019

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

Вот пример предложения:

"My body lies over the ocean, my body lies over the sea."

Я хочу создать следующее:

"My body (2) lies over the ocean (3), my body (2) lies over the sea."

Ниже приведена фиктивная версия моего алгоритма подсчета очков.Я понял, как взять текст, разорвать его на части и оценить.

Однако я застрял на том, как собрать его обратно в нужный мне формат.

Вот фиктивная версия моей функции:

def word_score(text):
    words_to_work_with = []
    words_to_return = []
    passed_text = TextBlob(passed_text)
    for word in words_to_work_with:
        word = word.singularize().lower()
        word = str(word)
        e_word_lemma = lemmatizer.lemmatize(word)
        words_to_work_with.append(e_word_lemma)
    for word in words to work with:
        if word == 'body':
            score = 2
        if word == 'ocean':
            score = 3
        else:
            score = None
        words_to_return.append((word,score))
    return words_to_return

Я относительный новичок, поэтому у меня есть два вопроса:

  1. Как собрать текст обратно, и
  2. Должна ли эта логика быть введена в функцию или вне ее?

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

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

Ответы [ 3 ]

1 голос
/ 30 марта 2019

Итак, в основном, вы хотите присвоить оценку каждому слову. Данную функцию можно улучшить, используя словарь вместо нескольких if операторов. Также вы должны вернуть все оценки, а не только оценку первой word в words_to_work_with, которая является текущим поведением функции, поскольку она вернет целое число на первой итерации. Таким образом, новая функция будет:

def word_score(text)
    words_to_work_with = []
    passed_text = TextBlob(text)
    for word in words_to_work_with:
        word = word.singularize().lower()
        word = str(word) # Is this line really useful ?
        e_word_lemma = lemmatizer.lemmatize(word)
        words_to_work_with.append(e_word_lemma)

    dict_scores = {'body' : 2, 'ocean' : 3, etc ...}
    return [dict_scores.get(word, None)] # if word is not recognized, score is None

Для второй части, которая реконструирует строку, я бы фактически сделал это в той же функции (так что это отвечает на ваш второй вопрос):

def word_score_and_reconstruct(text):
    words_to_work_with = []
    passed_text = TextBlob(text)

    reconstructed_text = ''

    for word in words_to_work_with:
        word = word.singularize().lower()
        word = str(word)  # Is this line really useful ?
        e_word_lemma = lemmatizer.lemmatize(word)
        words_to_work_with.append(e_word_lemma)

    dict_scores = {'body': 2, 'ocean': 3}
    dict_strings = {'body': ' (2)', 'ocean': ' (3)'}

    word_scores = []

    for word in words_to_work_with:
        word_scores.append(dict_scores.get(word, None)) # we still construct the scores list here

        # we add 'word'+'(word's score)', only if the word has a score
        # if not, we add the default value '' meaning we don't add anything
        reconstructed_text += word + dict_strings.get(word, '')

    return reconstructed_text, word_scores

Я не гарантирую, что этот код будет работать с первой попытки, я не могу его протестировать, но он даст вам основную идею

0 голосов
/ 30 марта 2019

Вот рабочая реализация. Функция сначала анализирует входной текст как список, так что каждый элемент списка представляет собой слово или комбинацию знаков пунктуации (например, запятая с последующим пробелом). Как только слова в списке обработаны, он объединяет список обратно в строку и возвращает ее.

def word_score(text):
    words_to_work_with = re.findall(r"\b\w+|\b\W+",text)
    for i,word in enumerate(words_to_work_with):
        if word.isalpha():
            words_to_work_with[i] = inflection.singularize(word).lower()
            words_to_work_with[i] = lemmatizer.lemmatize(word)
            if word == 'body':
               words_to_work_with[i] = 'body (2)'
            elif word == 'ocean':
               words_to_work_with[i] = 'ocean (3)'
    return ''.join(words_to_work_with)

txt = "My body lies over the ocean, my body lies over the sea."
output = word_score(txt)
print(output)

Выход:

My body (2) lie over the ocean (3), my body (2) lie over the sea.

Если у вас есть более 2 слов, которые вы хотите набрать, лучше использовать словарь вместо if условий.

0 голосов
/ 30 марта 2019

Надеюсь, это поможет. Судя по твоему вопросу, у меня это сработало.

С наилучшими пожеланиями !!

"""
Python 3.7.2

Input:
Saved text in the file named as "original_text.txt"
My body lies over the ocean, my body lies over the sea. 
"""
input_file = open('original_text.txt', 'r') #Reading text from file
output_file = open('processed_text.txt', 'w') #saving output text in file

output_text = []

for line in input_file:
    words =  line.split()
    for word in words:
        if word == 'body':
            output_text.append('body (2)')
            output_file.write('body (2) ')
        elif word == 'body,':
            output_text.append('body (2),')
            output_file.write('body (2), ')
        elif word == 'ocean':
            output_text.append('ocean (3)')
            output_file.write('ocean (3) ')
        elif word == 'ocean,':
            output_text.append('ocean (3),')
            output_file.write('ocean (3), ')
        else:
            output_text.append(word)
            output_file.write(word+' ')

print (output_text)
input_file.close()
output_file.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...