Код: Выделить всё
'NaicsDescription'). Я не уверен, что это лучший/самый чистый способ сделать это в Polars. Несмотря на то, что это, кажется, работает, и мы будем признательны за некоторые рекомендации.
Идея состоит в том, чтобы...
[list]
[*]применить к столбцу операцию нижнего регистра,
[*]условно применить некоторые дополнительные операции
[*]и, наконец, завершить некоторыми дополнительными общими операциями.
[/list]
Есть это правильно?
import polars as pl
from unicodedata import normalize
from lingua import Language, LanguageDetectorBuilder
from nltk.corpus import stopwords
languages = [Language.ENGLISH, Language.FRENCH]
detector = LanguageDetectorBuilder.from_languages(*languages).build()
test = pl.DataFrame(
{
"id": [1, 2, 3, 4],
"NaicsDescription": ['Full service restuarants', 'The Manufacturing of toys and trains', 'POWER GENERATING STATIONS', 'the short term rental of cottages']
}
)
def lang_identifier(text: str):
'''
Language identification of text. This is just a simple wrapper around lingua function.
Parameters
----------
text : str
Input string to identify language for.
Returns
-------
language : str
Returns either 'EN' or 'FR' or None if input text is not of type string.
'''
language = None
if isinstance(text, str):
language = detector.detect_language_of(text)
if language:
language = language.iso_code_639_1.name
return language
en_stopwords = '|'.join(set(w.lower() for w in stopwords.words('english')))
fr_stopwords = '|'.join(set(w.lower() for w in stopwords.words('french')))
bilingual_stopwords = '|'.join(set(w.lower() for w in stopwords.words('english') + stopwords.words('french')))
test = test.with_columns(
pl.col('NaicsDescription')
.str.to_lowercase().alias('NaicsDescription_')
).with_columns(
pl.when(pl.col('NaicsDescription').map_elements(lang_identifier, return_dtype=pl.String) == 'FR')
.then(
pl.col('NaicsDescription_').str.replace_all(r'\b(?:' + fr_stopwords + r')\b', ' ')
)
.when(pl.col('NaicsDescription').map_elements(lang_identifier, return_dtype=pl.String) == 'EN')
.then(
pl.col('NaicsDescription_').str.replace_all(r'\b(?:' + en_stopwords + r')\b', ' ')
)
.otherwise(
pl.col('NaicsDescription_').str.replace_all(r'\b(?:' + bilingual_stopwords + r')\b', ' ')
)
).with_columns(
pl.col('NaicsDescription_').map_elements(lambda x: normalize('NFKD',x)
.encode('ascii', errors='ignore')
.decode('utf-8'), return_dtype=pl.String)
.str.replace_all(r'(?:[^\s\w]|_\d)+', ' ')
.str.replace_all(r'\b(?:\d+|\w{1,2})\b', ' ')
.str.replace_all(r'\s\s+', ' ')
.str.strip_chars()
.replace('', None)
)
Подробнее здесь: https://stackoverflow.com/questions/785 ... -in-polars