Проблема с выделением английского текста в Python - PullRequest
0 голосов
/ 31 октября 2019

(ЗАМЕТЬТЕ, Я ОБНОВИЛ ПОСТ ВНУТРИ НИЖЕ)

У меня есть DataFrame of Yelp обзоры ресторанов rest_reviews. Отзывы хранятся в виде строк в столбце с пометкой 'text'. Я работаю с Python 3 и пытаюсь использовать библиотеку Langua , чтобы отфильтровать все отзывы, которые не написаны на английском языке.

Вот что я попробовал изначально:

from langua import Predict

# Step 1: function for detecting language
def lang(x):
    return Predict().get_lang(x)

# Step 2: list of English reviews
en_reviews = [rev for rev in rest_reviews['text'] if lang(rev) == 'en']

# Step 3: DataFrame of English restaurant reviews
en_rest_reviews = rest_reviews.loc[rest_reviews['text'].apply(lambda x: x in en_reviews), :]

Когда я попытался это сделать, на шаге 2 возникла ошибка: LangDetectException: No features in text. Это большой набор данных, и я не знаю, в какое значение столбца была брошена ошибка или почему она была выброшена, поэтому я решилНа шаге 2 выберите другой подход, чтобы выяснить, какие значения вызывают ошибку:

# separate error values from non-error values
errors = []
non_error_reviews = []

for rev in rest_reviews['text']:
    try:
        lang(rev) == 'en'
        non_error_reviews.append(rev)
    except (NoTextError, FormatError, FileLoadError, DuplicateLangError, NeedLoadProfileError, CantDetectError, CantOpenTrainData, TrainDataFormatError, InitParamError):
        errors.append(rev)
    else:
        non_error_reviews.append(rev)

Я написал предложение except с учетом документации . Документация гласит: «Исключающее предложение может называть несколько исключений в виде кортежа в скобках», и в нем приводится следующий пример:

except (RuntimeError, TypeError, NameError):
          pass

Поэтому я попытался использовать этот формат со всеми перечисленными кодами ошибок Langua здесь , но ошибка все равно была выдана. Похоже, была обнаружена ошибка, поэтому он попытался перейти к предложению except, а затем выдал ошибку NameError: name 'NoTextError' is not defined. Вот скриншот трассировки:

image of error Traceback

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

ОБНОВЛЕНИЕ


ХорошоЯ думаю, что добился определенного прогресса, но теперь я в замешательстве. Я сейчас использую библиотеку Langdetect (а не библиотеку Langua), используя этот код:

from langdetect import detect
from langdetect.lang_detect_exception import LangDetectException

errors1 = []
non_error_reviews1 = []

for rev in rest_reviews['text']:
    try:
        detect(rev) == 'en'
        non_error_reviews1.append(rev)
    except LangDetectException:
        errors1.append(rev)
    else:
        non_error_reviews1.append(rev)

Когда я запустил это, он выдал другую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<timed exec> in <module>

/Applications/anaconda3/lib/python3.7/site-packages/langdetect/detector_factory.py in detect(text)
    127     init_factory()
    128     detector = _factory.create()
--> 129     detector.append(text)
    130     return detector.detect()
    131

/Applications/anaconda3/lib/python3.7/site-packages/langdetect/detector.py in append(self, text)
    102         Detector.set_max_text_length(int), the rest is cut down.
    103         '''
--> 104         text = self.URL_RE.sub(' ', text)
    105         text = self.MAIL_RE.sub(' ', text)
    106         text = NGram.normalize_vi(text)

TypeError: expected string or bytes-like object

Что такоеменя смущает то, что я проверил:

len(non_error_reviews1) и он вернул: 4702694

Но когда я проверяю размер столбца:

len(rest_reviews['text']), он возвращает только:4067283

Таким образом, после итерации и запуска ошибки список каким-то образом содержит больше элементов, чем исходный столбец. Как это может быть?

Я тоже не понимаю, что означает ошибка. Я проверил нулевые значения в столбце и убедился, что все значения в столбце являются строками.

...