Estrazione di informazioni utili da testo libero

1

Filtriamo e analizziamo i posti per eventi. Apparentemente scrivere un linguaggio di query di dominio per le persone del piano non è un'opzione. Sto usando C # 4.0 e amp; .NET 4.0, e hanno un regno relativamente libero per usare qualunque strumento open-source disponibile. < / background-Info >

Se arriva una richiesta per "FLOOR B", gli addetti alle vendite vogliono che vengano visualizzati se hanno inserito "FLOOR A-FLOOR F" in un filtro. L'unico problema che ho è che non c'è assolutamente alcuna struttura ai parametri analizzati. Ottengo la stringa già concatenata (in realtà utilizza una tilde anziché un trattino). Esempi che ho visto finora con le partite dopo ciascuna:

  • 101WC-199WC (deve corrispondere a 150WC)
  • AAA-ZZZ (deve corrispondere a AAA, BBB, ABC ma non BB)
  • LOGE15-LOGE20 (deve corrispondere a LOGE15 ma non a LOGE150)

All'inizio volevo provare solo a togliere la parte numerica del superiore e inferiore, e poi a incrementare attraverso quella. Il problema che ho è che solo alcune voci hanno numeri, a volte i numeri e le lettere aumentano, a volte tutte le lettere che aumentano. Dal momento che non posso imporre alcun tipo di grammatica da usare (volevo davvero [...] sintassi di espansione), sono bloccato usando queste voci.

Ci sono suggerimenti su come affrontare questo problema di analisi?

    
posta Bryan Boettcher 04.12.2012 - 23:37
fonte

2 risposte

1

L'unico modello che riesco a vedere è che hai lettere seguite da cifre o cifre seguite da lettere o solo lettere.

Da questo punto, il primo passo sarebbe separare la stringa all'inizio e alla fine, quindi separare ciascuna parte in un gruppo di una o due entità:

"AB12-ZZ789" → ["AB12", "ZZ789"] → [["AB", "12"], ["ZZ", "789"]]

Le entità numeriche possono essere convertite in numeri:

[["AB", "12"], ["ZZ", "789"]] → [["AB", 12], ["ZZ", 789]]

Quindi, le lettere possono essere convertite nella rispettiva rappresentazione numerica. Ad esempio, se "A" è mappato a 0, "B" - a 1, ecc., "AB" è 0 × 26 + 1, mentre "ZZ" è 25 × 26 + 25.

[["AB", 12], ["ZZ", 789]] → [[26, 12], [675, 789]]

Una volta eseguita questa conversione, è piuttosto semplice sapere se il valore è compreso nell'intervallo. Ad esempio,

"HC52" → ["HC", "52"]
       → ["HC", 52]
       → [(7 × 26 + 2), 52]
       → [184, 52]

26 ≤ 184 ≤ 675 e 12 ≤ 52 ≤ 789, quindi il valore è compreso nell'intervallo.

"HC999" → ["HC", "999"]
        → ["HC", 999]
        → [(7 × 26 + 2), 999]
        → [184, 999]

26 ≤ 184 ≤ 675, ma (12 ≤ 999 ≤ 789) è falso, quindi il valore è al di fuori dell'intervallo.

    
risposta data 05.12.2012 - 00:47
fonte
0

Stringa i requisiti.

Nelle specifiche come descritto, c'è una quantità significativa di ambiguità nella grammatica. L'intervallo A100-A200 ha più di due stringhe valide. La domanda è: la parte 00 dell'intervallo descritto in questo esempio indica una classe di caratteri (qualsiasi cifra) o una stringa costante?

Indipendentemente dal modo in cui hai scelto, c'è la possibilità che tu possa sbagliare per un determinato intervallo.

Le opzioni sono indovinate, puoi provare una libreria di lingue naturali (e indovinarla al posto tuo), oppure puoi stringere i requisiti per rimuovere tali ambiguità.

Consiglio vivamente di provare a stringere i requisiti. Le alternative a questo avranno percepito bug e documentazione non chiara per l'utente finale.

    
risposta data 05.12.2012 - 00:46
fonte

Leggi altre domande sui tag