Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Syndicate_Admin
Administrator
Administrator

Luchando con TOPN

Estoy tratando de clasificar a las empresas en función de la frecuencia de palabras específicas en su descripción que cada trabajo está asociado con un sector de red diferente.

Aquí hay una descripción "Ofrecemos servicios y experiencia en el campo de la cristalografía de proteínas de rayos X a empresas farmacéuticas y biotecnológicas. Nuestros servicios incluyen: Nos esforzamos por integrar el trabajo que proporcionamos sin problemas y eficientemente en los procesos y el flujo de trabajo de nuestros clientes".

Si solo tengo 2 palabras clave tengo esta tabla "Palabras clave de prueba"

Peso de las palabras clave del sector

fabricaciónproceso 3
Bioanalíticoproteína 2

Mi medida de columna es, pero simplemente devuelve no encontrado cuando esperaría "Fabricación" como el sector que tiene la puntuación más alta de los pesos de palabras clave agregados.

=
VAR
keywordinstance=SUMX(Testing_Keyword,
    
        Testing_Keyword[Weight]*
        (LEN(LOWER(CRO_Company[Description]))-LEN(SUBSTITUTE(LOWER(CRO_Company[Description]),LOWER(Testing_Keyword[Keyword]),"")))/
        LEN(Testing_Keyword[Keyword])
    )

RETURN
IFERROR(CALCULATE(DISTINCT(Testing_Keyword[Sector]),TOPN(1,VALUES(Testing_Keyword[Sector]),keywordinstance)),"Not Found")

Si cambio el bit distinto a keywordinstance su 5. ¿Así que esta fórmula está dando la totla en todos los sectores no el TopN?

Cualquier ayuda apreciada como surei está haciendo algo muy tonto

1 ACCEPTED SOLUTION
Syndicate_Admin
Administrator
Administrator

Sí, era un poco difícil saber si estaba trabajando con sólo una fila de datos de prueba. Creo que lo siguiente está más cerca, pero potencialmente todavía podría terminar con múltiples sectores con la misma puntuación que no estoy seguro de cómo querría romper los lazos.

Column = CONCATENATEX(
    var _topn =
    TOPN(1, ALL(Testing_Keyword[Sector]),
        var _currentSector = Testing_Keyword[Sector]
        var _sectorKeywords = CALCULATETABLE(GROUPBY(Testing_Keyword, Testing_Keyword[Weight], Testing_Keyword[Keyword]), TREATAS( {_currentSector}, Testing_Keyword[Sector] ))
        var _score = SUMX(
            _sectorKeywords,
            Testing_Keyword[Weight]  * 
            (LEN(LOWER(CRO_Company[Description])) - LEN(SUBSTITUTE(LOWER(CRO_Company[Description]),LOWER(Testing_Keyword[Keyword]),""))) /
            LEN(Testing_Keyword[Keyword])
            )
        return _score
    )
    // if the _topn variable contains all the rows from the keyword table this probably
    // means that none of the keywords matched so they all scored 0 so we should 
    // filter them all out
    var _condition = if(COUNTROWS(all(Testing_Keyword[Sector])) = COUNTROWS(_topn),FALSE(), True())
    return filter( _topn, _condition)
,[Sector]
,",")

Mientras estaba probando esto, también construí la siguiente columna para poder ver la puntuación ponderada por sector, esto puede ser útil si desea seguir depurando usted mismo.

Column 2 = 
CONCATENATEX( ALL(Testing_Keyword[Sector]),
var _currentSector = Testing_Keyword[Sector]
var _sectorKeywords = CALCULATETABLE(GROUPBY(Testing_Keyword, Testing_Keyword[Weight], Testing_Keyword[Keyword]), TREATAS( {_currentSector}, Testing_Keyword[Sector] ))
var _score = SUMX(
        _sectorKeywords,
        Testing_Keyword[Weight]  * 
        (LEN(LOWER(CRO_Company[Description])) - LEN(SUBSTITUTE(LOWER(CRO_Company[Description]),LOWER(Testing_Keyword[Keyword]),""))) /
        LEN(Testing_Keyword[Keyword])
        )
        return _currentSector & " (" & _score & ") "
)

View solution in original post

6 REPLIES 6
Syndicate_Admin
Administrator
Administrator

Sí, era un poco difícil saber si estaba trabajando con sólo una fila de datos de prueba. Creo que lo siguiente está más cerca, pero potencialmente todavía podría terminar con múltiples sectores con la misma puntuación que no estoy seguro de cómo querría romper los lazos.

Column = CONCATENATEX(
    var _topn =
    TOPN(1, ALL(Testing_Keyword[Sector]),
        var _currentSector = Testing_Keyword[Sector]
        var _sectorKeywords = CALCULATETABLE(GROUPBY(Testing_Keyword, Testing_Keyword[Weight], Testing_Keyword[Keyword]), TREATAS( {_currentSector}, Testing_Keyword[Sector] ))
        var _score = SUMX(
            _sectorKeywords,
            Testing_Keyword[Weight]  * 
            (LEN(LOWER(CRO_Company[Description])) - LEN(SUBSTITUTE(LOWER(CRO_Company[Description]),LOWER(Testing_Keyword[Keyword]),""))) /
            LEN(Testing_Keyword[Keyword])
            )
        return _score
    )
    // if the _topn variable contains all the rows from the keyword table this probably
    // means that none of the keywords matched so they all scored 0 so we should 
    // filter them all out
    var _condition = if(COUNTROWS(all(Testing_Keyword[Sector])) = COUNTROWS(_topn),FALSE(), True())
    return filter( _topn, _condition)
,[Sector]
,",")

Mientras estaba probando esto, también construí la siguiente columna para poder ver la puntuación ponderada por sector, esto puede ser útil si desea seguir depurando usted mismo.

Column 2 = 
CONCATENATEX( ALL(Testing_Keyword[Sector]),
var _currentSector = Testing_Keyword[Sector]
var _sectorKeywords = CALCULATETABLE(GROUPBY(Testing_Keyword, Testing_Keyword[Weight], Testing_Keyword[Keyword]), TREATAS( {_currentSector}, Testing_Keyword[Sector] ))
var _score = SUMX(
        _sectorKeywords,
        Testing_Keyword[Weight]  * 
        (LEN(LOWER(CRO_Company[Description])) - LEN(SUBSTITUTE(LOWER(CRO_Company[Description]),LOWER(Testing_Keyword[Keyword]),""))) /
        LEN(Testing_Keyword[Keyword])
        )
        return _currentSector & " (" & _score & ") "
)

tristemente voló mi excel!!!!! tengo 2.500 empresas, así que debe ser demasiado para ello a pesar de 64 GB de RAM


@masplin escribió:

tristemente voló mi excel!!!!! tengo 2.500 empresas, así que debe ser demasiado para ello a pesar de 64 GB de RAM


Hmm, eso no debería explotar con un conjunto de datos tan pequeño. ¿Cuántas palabras clave tiene?

Otro enfoque sería hacerlo en Power Query, aunque la búsqueda de palabras clave es un poco complicada. He codificado una función a mano en el archivo pbix adjunto, no creo que haya una manera fácil de hacerlo con la interfaz de usuario. (este archivo también tiene el enfoque basado en DAX en él)

brillante. Realmente aprecio tu ayuda. Pasará algún tiempo entendiendo la sintaxis de la solución

Syndicate_Admin
Administrator
Administrator

El problema aquí es que va a calcuar la instancia de palabra clave una vez al principio de la expresión y, a continuación, almacenar el valor en una variable. Así que cuando se llama a TOPN ese mismo valor se está utilizando para cada palabra clave, lo que significa que TOPN devuelve todas las palabras clave, ya que todas tienen la misma puntuación.

Así que en el código siguiente simplemente he movido la expresión que tenía en la variable dentro del TOPN para que se vuelva a calcular para cada fila en Testing_Keyword. Luego he envuelto todo el asunto en un CONCATENATEX para producir un solo valor escalar y he añadido una comprobación adicional para filtrar los resultados donde se devuelven todas las palabras clave (esto sucederá si no se encuentran palabras clave porque todas obtendrán la misma puntuación de 0)

Column = CONCATENATEX(
    var _topn =
    TOPN(1, Testing_Keyword,
        Testing_Keyword[Weight] * 
        (LEN(LOWER(CRO_Company[Description])) - LEN(SUBSTITUTE(LOWER(CRO_Company[Description]),LOWER(Testing_Keyword[Keyword]),""))) /
        LEN(Testing_Keyword[Keyword])
    )
    // if the _topn variable contains all the rows from the keyword table this probably
    // means that none of the keywords matched so they all scored 0 so we should 
    // filter them all out
    var _condition = if(COUNTROWS(Testing_Keyword) = COUNTROWS(_topn),FALSE(), True())
    return filter( _topn, _condition)
,[Sector]
,",")

hola. Eso es muy elegante. La única isssue es que si encuentra más de 1 palabra clave está generando una serie de sectores como este, lo que debe significar que no resume los pesos para encontrar el sector con la puntuación total más higest. ¿Creo que necesita un SUMX en alguna parte?

Bioanalítico, Bioanalítico, Bioanalítico

Lo anterior es la descripción

"Bioassay GmbH ofrece servicios de pruebas de eficacia y seguridad con el uso de roedores in vivo y modelos in vitro." Donde las palabras clave son in vivo (10), in vitro (10), ensayo (5) y servicios de prueba (1 para CRO). así que la puntuación para bioanlítico es 25 con una sola salida.

Originalmente sólo quería una producción sectorial, la que tenga la puntuación más higest, pero a veces tienes empates. No estoy seguro de cómo su código está manejando que al igual que parece no estar utilizando alfabético cuando más de 1 sector por lo que debe estar utilizando el peso.

En realidad no puede resolver ningún patrón aquí.

"DKFZ German Cancer Research Center ofrece servicios de anticuerpos, proteómicos, genómicos y secuenciación."

Cáncer 3 Biomédico

por 3 bionalíticos

secuenciación 5 bioanalítica

Así que las puntuaciones bioanalíticas 8 también lo es el sector superior, pero la producción está en orden inverso. en esto debe ser sólo bioanalítico como sin corbata.

Biomédico, Bioanalítico

Seguro que estás muy cerca, pero realmente no entiendo el código.

Muy apreciado Mike

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.