one column python pandas nlp normalize

python - column - Cómo normalizar nombres



normalize one column pandas (2)

splitCompaniesSet = map( lambda cmpnyName : set( map( lambda name : name.split(" "), cmpnyName ) ), dataFrame[''Company''] )

Creo que es correcto.

Básicamente, cree una lista de conjuntos; cada conjunto tiene el nombre de la empresa dividido. Luego, comenzando con el primer elemento, encuentre la intersección establecida de cada otro elemento con esa. Para cada intersección no vacía, cambie el nombre a la coincidencia más simple entre todos los conjuntos resultantes no vacíos, es decir, tome una intersección de conjunto más con todos los conjuntos no vacíos y establezca el resultado como el nombre de la empresa para todos los no partidos vacíos.

Luego vaya a la siguiente Company que resultó en un conjunto vacío cuando se cruza con el primer nombre de la compañía. Luego, haga esto para la próxima Company que estuvo vacía durante los primeros dos que intentó, y así sucesivamente.

Sin embargo, es probable que haya una forma más eficiente de hacerlo.

Estoy usando data frames de pandas y tengo datos donde tengo clientes por empresa. Sin embargo, los títulos de la compañía varían levemente pero finalmente afectan los datos. Ejemplo:

Company Customers AAAB 1,000 AAAB Inc. 900 The AAAB Inc. 20 AAAB the INC 10

Quiero obtener el total de clientes de una base de datos de varias compañías diferentes con compañías que tienen nombres no estándar. Alguna idea de donde debería comenzar?


Recuerdo leer este blog sobre la biblioteca fuzzywuzzy (investigando otra pregunta ), que puede hacer esto:

pip install fuzzywuzzy

Puede usar su función partial_ratio para "combinar difusamente" las cadenas:

In [11]: from fuzzywuzzy.fuzz import partial_ratio In [12]: partial_ratio(''AAAB'', ''the AAAB inc.'') Out[12]: 100

¡Lo cual parece seguro de que es un buen partido!

In [13]: partial_ratio(''AAAB'', ''AAPL'') Out[13]: 50 In [14]: partial_ratio(''AAAB'', ''Google'') Out[14]: 0

Podemos tomar la mejor coincidencia en la lista de la compañía real (suponiendo que la tenga):

In [15]: co_list = [''AAAB'', ''AAPL'', ''GOOG''] In [16]: df.Company.apply(lambda mistyped_co: max(co_list, key=lambda co: partial_ratio(mistyped_co, co))) Out[16]: 0 AAAB 1 AAAB 2 AAAB 3 AAAB Name: Company, dtype: object

Sospecho fuertemente que hay algo en scikit learn o en una biblioteca numpy para hacer esto de manera más eficiente en grandes conjuntos de datos ... pero esto debería hacer el trabajo.

Si no tiene la lista de la compañía probablemente tendrá que hacer algo más interesante ...