I’m trying to extract data from a few large textfiles containing entries about people. The problem is, though, I cannot control the way the data comes to me.
It is usually in a format like this:
LASTNAME, Firstname Middlename (Maybe a Nickname)Why is this text hereJanuary, 25, 2012
Firstname Lastname 2001 Some text that I don’t care about
Lastname, Firstname blah blah … January 25, 2012 …
Currently, I am using a huge regex that splits all kindaCamelcase words, all words that have a month name tacked onto the end, and a lot of special cases for names. Then I use more regex to extract a lot of combinations for the name and date.
This seems sub-optimal.
Are there any machine-learning libraries for Python that can parse malformed data that is somewhat structured?
I’ve tried NLTK, but it could not handle my dirty data. I’m tinkering with Orange right now and I like it’s OOP style, but I’m not sure if I’m wasting my time.
Ideally, I’d like to do something like this to train a parser (with many input/output pairs):
training_data = (
'LASTNAME, Firstname Middlename (Maybe a Nickname)FooBarJanuary 25, 2012',
['LASTNAME', 'Firstname', 'Middlename', 'Maybe a Nickname', 'January 25, 2012']
)
Is something like this possible or am I overestimating machine learning? Any suggestions will be appreciated, as I’d like to learn more about this topic.
I ended up implementing a somewhat-complicated series of exhaustive regexes that encompassed every possible use case using text-based “filters” that were substituted with the appropriate regexes when the parser loaded.
If anyone’s interested in the code, I’ll edit it into this answer.
Here’s basically what I used. To construct the regular expressions out of my “language”, I had to make replacement classes:
Then, I made a generic
Matcherclass, which constructed a regex for a particular pattern given the pattern name:Finally, there’s the generic
Patternobject:It got pretty complicated, but it worked. I’m not going to post all of the source code, but this should get someone started. In the end, it converted a file like this:
Into a compiled regex with named capturing groups.