Techniques d'apprentissage automatique pour l'analyse des chaînes?

30

J'ai beaucoup de chaînes d'adresse:

1600 Pennsylvania Ave, Washington, DC 20500 USA

Je veux les analyser dans leurs composants:

street: 1600 Pennsylvania Ave
city: Washington
province: DC
postcode: 20500
country: USA

Mais bien sûr, les données sont sales: elles proviennent de nombreux pays dans de nombreuses langues, écrites de différentes manières, contiennent des fautes d'orthographe, des pièces manquantes, des ordures supplémentaires, etc.

À l'heure actuelle, notre approche consiste à utiliser des règles combinées avec la correspondance de répertoires flous, mais nous aimerions explorer les techniques d'apprentissage automatique. Nous avons étiqueté les données de formation pour l'apprentissage supervisé. La question est, quel genre de problème d'apprentissage automatique est-ce? Il ne semble pas vraiment s'agir d'un regroupement, d'une classification ou d'une régression ...

Le plus proche que je puisse trouver serait de classer chaque jeton, mais alors vous voulez vraiment les classer tous simultanément, en satisfaisant aux contraintes comme "il devrait y avoir au plus un pays;" et vraiment il y a plusieurs façons de tokeniser une chaîne, et vous voulez essayer chacune et choisir la meilleure .... Je sais qu'il existe une chose appelée analyse statistique, mais je n'en sais rien.

Donc: quelles techniques d'apprentissage automatique pourrais-je explorer pour analyser les adresses?

Jay Hacker
la source
Je ne suis pas un expert de votre problème de haut niveau pour publier une réponse, mais je pense que la première étape de l'apprentissage automatique consiste à créer des fonctionnalités informatives, puis à choisir la méthode appropriée compte tenu de leur structure. Vous avez beaucoup de structure; alnum vs non-alnum chars, numeric vs alpha tokens, token count between ',' splits, numeric token lengths. par exemple, divisez sur ',' et comptez le nombre de jetons dans chaque division (adresse postale vs ville / état vs informations spécifiques à la géographie); calc strlen des jetons numériques (adresse postale vs code postal). Cela vous donne des fonctionnalités sur lesquelles vous pouvez vous regrouper.
muratoa
Jetez un oeil à la découpe de texte .
alto
2
Regardez également la reconnaissance des entités nommées et la tâche plus générale d' extraction d'informations
Yuval F
@YuvalF Je suggère d'en faire une réponse. Pouvez-vous élaborer un peu, peut-être un exemple de document où une méthode ML a été utilisée?
steffen
Je suis également très intéressé par ce problème spécifique - qui consiste à structurer une adresse postale en ses composants. Nous essayons de le faire dans un appareil mobile sans présomption de connectivité à un service de géocodage inversé tel que Google. Il est acceptable de supposer que nous avons une source intégrée de données liées concernant la ville, l'état, le pays et le code postal. Toute aide - soit des pointeurs - ou désireuse de s'engager avec une équipe de démarrage folle sur ce problème est chaleureusement et ouvertement bienvenue.

Réponses:

10

Cela peut être considéré comme un problème d'étiquetage de séquence , dans lequel vous avez une séquence de jetons et souhaitez donner une classification pour chacun. Vous pouvez utiliser des modèles de Markov cachés (HMM) ou des champs aléatoires conditionnels (CRF) pour résoudre le problème. Il existe de bonnes implémentations de HMM et CRF dans un package open-source appelé Mallet .

Dans votre exemple, vous devez convertir l'entrée au format ci-dessous. De plus, vous devez générer des fonctionnalités supplémentaires.

1600 STREET
Pennsylvania STREET
Ave STREET
, OUT
Washington CITY
, OUT
DC PROVINCE
20500 POSTCODE
USA COUNTRY
William Fernandes
la source
1
Je ne pense pas qu'un tagueur de séquence standard (comme un HMM de CRF) va produire de très bons résultats dans cette situation. Cela est dû aux restrictions selon lesquelles les groupes de balises sont contigus et que chaque balise ne se produit qu'une seule fois par séquence. Je ne pense pas que vous puissiez facilement modifier la recherche pour incorporer ces informations en raison de la dépendance des balises passées / futures de distance arbitraire (je pourrais me tromper à ce sujet cependant).
alto
@alto Je pense que le CRF prend en considération le contexte voisin. HMM ne peut pas voir l'état passé, vous avez raison, cela ne fonctionnerait probablement pas très bien.
JT
1

J'ai dû résoudre un problème très similaire pour valider si une adresse est valide ou invalide.

Les adresses ont généralement la structure "1600 Pennsylvania Ave, Washington DC, 20500"

Une chaîne telle que

"J'ai descendu 2000 marches et j'ai atteint Pennsylvania Ave à Washington DC."

n'est pas une adresse valide.

Cela peut être résolu par des techniques de classification telles que SVM, les réseaux de neurones, etc.

L'idée est d'identifier un ensemble clé de fonctionnalités. Certains d'entre eux pourraient être:

1) Le nom de la rue commence-t-il par un numéro de bloc valide. La plupart des numéros de bloc aux États-Unis sont soit des chiffres (par exemple 1200), soit un nombre suivi d'une seule lettre (120A) ou un nombre suivant une seule lettre (par exemple S200).

2) Si l'adresse est bien formatée, les noms de rue se terminent par des suffixes comme Ave pour avenue, Dr pour Drive, Blvd pour Boulevard. Il est possible d'obtenir la liste des suffixes de rue aux États-Unis sur le site USPS.

3) Le nombre de mots dans le champ d'adresse de rue peut également être une caractéristique intéressante. S'il y a trop de mots, ce n'est probablement pas une adresse valide. Voir par exemple l'exemple ci-dessus.

4) Combien de mots apparaissent entre le numéro de bloc et le suffixe de rue dans le champ d'adresse?

Ceux-ci peuvent être utilisés pour former un algorithme d'apprentissage et le modèle résultant peut être utilisé pour valider si une adresse donnée est valide ou non.


la source
1

C'est un peu un hack qui ne nécessite pas votre propre solution: le géocodage inversé. Cela peut vous donner des données plus propres ou faire tout le travail pour vous.

Par exemple, voici un code Stata avec geocode3de SSC, qui utilise Google. Je suppose que c'est similaire à Fuzzy Gazetteer . La première adresse est assez salissante, la seconde est propre et la troisième est étrangère. D'autres logiciels peuvent gérer cela également.

clear
set obs 3
gen address =""
replace address = "Big Foot Museum in Felton CA" in 1
replace address = "1600 Pennsylvania Ave, Washington, DC 20500 USA" in 2 
replace address = "ул. Ильинка, д. 23 103132, Москва, Россия" in 3
geocode3, address(address)
gen coord = string(g_lat) + "," + string(g_lon)
geocode3, reverse coord(coord)

Cela fonctionne assez bien:

. list r_addr , clean noobs

                                                                             r_addr  
                                      121 San Lorenzo Avenue, Felton, CA 95018, USA  
    1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA  
                                         ulitsa Ilyinka, 23, Moscow, Russia, 101000  

Le Kremlin a un format assez différent.

Dimitriy V. Masterov
la source
0

Cela ressemble à un problème à résoudre avec la classification LSTM bidirectionnelle. Vous marquez chaque caractère de l'échantillon comme une catégorie par exemple

rue: 1 ville: 2 province: 3 code postal: 4 pays: 5

1600 Pennsylvania Ave, Washington, DC 20500 USA
111111111111111111111, 2222222222, 33 44444 555

Maintenant, entraînez votre classificateur sur la base de ces étiquettes. Boom!

Fardin
la source