Фильтрация английских слов с определенной длиной

#python #pandas

#python #панды

Вопрос:

У меня есть этот список (из столбца pandas: df['Text'].tolist() :

 my_list=[came',
 'ป้องกัน',
 'moreover',
 'sah',
 'esketamine',
 'accredited',
 'condition',
 'tailored',
 'acts',
 'terms',
 "'",
 'البارد',
 'demonstrate',
 'amidst',
 'atotxa',
 'design',
 'ante',
 'ebsite',
 'problems',
 'oncosomes',
 'gradient',
 'tenable',
 'processing',
 'elemental',
 'card',
 'spreads',
 'मंत्रालय',
 'airlines',
 'desde',
 'retains',
 'n',
 '–',
 'ты']
  

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

-применить фильтр для слов, имеющих длину> 2:

 new_corpus = list( map(lambda words: list(filter(lambda word: len(word)> 2, words)), my_list))
  

-затем применить detect() для каждого элемента в списке:

  def det(x):
            lang = detect(x)
            return lang

 new_corpus.apply(det)
  

Проблема в том, что с первым кодом я получаю все [] (пустые элементы), поэтому я не могу применить какую-либо detect функцию к списку.

Мой ожидаемый результат будет:

 my_list=[came',
 'moreover',
 'sah', # it depends on detect function, if it selects this element as English or not
 'esketamine',
 'accredited',
 'condition',
 'tailored',
 'acts',
 'terms',

 'demonstrate',
 'amidst',    # it depends on detect function, if it selects this element as English or not
 'atotxa',    # it depends on detect function, if it selects this element as English or not
 'design',
 'ante',
 'ebsite',    # it depends on detect function, if it selects this element as English or not
 'problems',
 'oncosomes', # it depends on detect function, if it selects this element as English or not
 'gradient',
 'tenable',
 'processing',
 'elemental',
 'card',
 'spreads',
 'airlines',
 'desde',      # it depends on detect function, if it selects this element as English or not
 'retains'
]
  

Ответ №1:

Давайте сделаем

 cond1 = df['Text'].str.len()>=2
cond2 = df['Text'].map(detect)=='en'

df_sub = df[cond1 amp; cond2]
#df.loc[cond1 amp; cond2, 'Text'].tolist()
  

Комментарии:

1. Большое вам спасибо @BEN_YO. Я выбрал другой ответ только потому, что нашел его более похожим на то, что я пытался сделать. Но и ваш отлично работает и использует другой подход. Спасибо

Ответ №2:

Самый простой способ сделать это — использовать понимание списка.Это позволяет свести всю логику к одной строке. Реализация может быть:

 new_corpus = [word for word in my_list if len(word) > 2 and detect(word)]
  

Кроме того, этот метод можно использовать для создания отфильтрованного списка непосредственно из фрейма данных. Реализация может быть:

 new_corpus = [word for word in df['Text'].tolist() if len(word) > 2 and detect(word)]
  

Однако это не позволяет df['Text'].tolist() впоследствии получить доступ.

Комментарии:

1. Спасибо вам обоим за ваш ответ, поскольку оба отлично работают. Я хотел бы предложить одну вещь, @bbnumber2: с помощью detect можно получить ошибку из-за длины слова. Поэтому, вероятно, было бы лучше переключить detect и len в вашем коде. Таким образом, код будет выполняться без ошибок 😉

2. И еще одно: автоматически ли он определяет ‘en’ как язык? это работает, но я хотел бы понять, выполняется ли это автоматически и / или мне нужно что-то сделать, чтобы изменить / определить другой язык

3. @still_learning Это будет зависеть от вашей реализации detect() функции.