Как подготовить текст для конвейера машинного обучения со скомпилированными регулярными выражениями и / или пониманием списка? - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь подготовить текст в функции Python для конвейера машинного обучения, и у меня возникают проблемы с получением правильного вывода.Итак, я хочу сделать строчные буквы для всех слов, заменить символы пробелами, удалить символы и удалить стоп-слова из nltk.Я испробовал все виды различных подходов, от понимания списка до сопоставления с регулярным выражением, но я все еще не могу сделать это правильно.Пожалуйста, помогите!Вот необходимый импорт и основная функция:

import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords

import re

Вот функция:

REPLACE_BY_SPACE_RE = re.compile('[/(){}\[\]\|@,;]')
BAD_SYMBOLS_RE = re.compile('[^0-9a-z #+_]')
STOPWORDS = set(stopwords.words('english'))

def text_prepare(text):
"""
    text: a string

    return: modified initial string
"""

lower = text.lower() # lowercase text
space_replace = REPLACE_BY_SPACE_RE.sub(" ",lower) #replace REPLACE_BY_SPACE_RE symbols by space in text
nosymb = BAD_SYMBOLS_RE.sub("",space_replace) # delete symbols which are in BAD_SYMBOLS_RE from text
text = [word for word in nosymb if word not in STOPWORDS] # delete                                                                                                             stopwords from text

return text

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

def test_text_prepare():
    examples = ["SQL Server - any equivalent of Excel's CHOOSE function?",
            "How to free c++ memory vector<int> * arr?"]
    answers = ["sql server equivalent excels choose function", 
           "free c++ memory vectorint arr"]
    for ex, ans in zip(examples, answers):
    if text_prepare(ex) != ans:
        return "Wrong answer for the case: '%s'" % ex
return 'Basic tests are passed.'

Вотмой результат теста:

print(test_text_prepare())
Wrong answer for the case: 'SQL Server - any equivalent of Excel's CHOOSE function?'

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

text = [слово в слово в nosymb, если слово не в STOPWORDS] обрабатывает каждый символ как отдельный символ.попробуйте это:

text = '' .join ([слово в слово в nosymb.split (), если слово отсутствует в STOPWORDS])

Сначала он разбивает текст на список слов изатем объединяет их в строку.

Вот функция:

def text_prepare(text):

    lower = text.lower()# lowercase text
    space_replaced = REPLACE_BY_SPACE_RE.sub(" ",text)# replace REPLACE_BY_SPACE_RE symbols by space in text
    nosymb = BAD_SYMBOLS_RE.sub("",text)# delete symbols which are in BAD_SYMBOLS_RE from text
    text = ' '.join([word for word in nosymb.split() if word not in STOPWORDS]) # delete stopwords from text
    return text
0 голосов
/ 11 декабря 2018

Вы воспринимаете слова как отдельные символы в [word for word in nosymb if word not in STOPWORDS].Кроме того, вы не удаляете начальные / конечные пробелы и не «сокращаете» лишние пробелы, которые возникают в результате ваших предыдущих операций очистки.

Вот обновленный метод:

def text_prepare(text):
    """
    text: a string
        return: modified initial string
    """
    lower = text.lower() # lowercase text
    space_replace = REPLACE_BY_SPACE_RE.sub(" ",lower) #replace REPLACE_BY_SPACE_RE symbols by space in text
    nosymb = BAD_SYMBOLS_RE.sub("",space_replace) # delete symbols which are in BAD_SYMBOLS_RE from text
    text = re.sub(r"\s*\b(?:{})\b".format("|".join(STOPWORDS)), "", nosymb) # delete STOPWORDS
    return re.sub(r" {2,}", " ", text.strip())

* re.sub(r"\s*\b(?:{})\b".format("|".join(STOPWORDS)), "", nosymb) part удаляет все стоп-слова, совпадающие с целыми словами (\b является границей слова).

Часть re.sub(r" {2,}", " ", text.strip()) обрезает строку и сжимает все пробелы в один пробел внутри строки.

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