2013-03-03 6 views
4

У меня есть тысячи строк текста, где мне нужно найти деньги -представлениями т.д .:Python - Regex «Machine Learning»

Lorem ipsum dolor sit amet, 100.000,00 USD sadipscing elitr, sed diam nonumy eirmod 
GBP 400 ut labore et dolore magna aliquyam erat, sed diam voluptua. At USD 20 eos et 
accusam et justo duo dolores et 100,000.00 USD ea rebum. Stet 3,-- USD gubergren, no 

питон скрипт должен вернуть сумму конвертирована в доллары США. (например, 100000USF, 400 GBP -> USD и т. д.)

То, что я делал до сих пор, вручную создавал регулярные выражения для чисел - комбинации валют, чтобы вернуть значение, затем сравнить валюту с базой данных и вычислить обмен.

Однако это не является ни эффективным, ни будущим доказательством (например, если добавлена ​​другая валюта) Так что мне интересно, есть ли эффективный алгоритм машинного обучения, который я мог бы «обучать» примерами, а затем пытается найти sich "value - currency"?

+0

будет ли денежная информация всегда представлена ​​в виде пары единиц + единиц измерения, или вы хотите обрабатывать такие случаи, как: миллион долларов США? Если вы в первом случае, а ваши данные более или менее структурированы, тогда вам лучше пойти на регулярное выражение, иначе вам понадобится более продвинутая стратегия микшерного машинного обучения и обработка естественного языка ... – bendaizer

ответ

2

Ваша проблема не совсем определена, но нет необходимости в машинах. Набор возможных валют конечен и мал, а набор валютных представлений не может быть настолько сложным, чтобы не быть выраженным как регулярное выражение. Вы просто не используете полную силу регулярных выражений.

Например, в соответствии с нескольких валют, используйте:

currency = r"((USD)|(GBP)(...))" 

Вы можете выразить число часть представления

numbers = r"([0-9]+[0-9\.,]*)" 

Скомпилирует регулярное выражение:

matcher = re.compile(numbers+r"[\s]*+"currency) 

Вы можете создать второй матчи, который сначала соответствует валютам. Возможно, вы сможете использовать что-то умное с необязательными группами захвата и т. Д., Но я бы порекомендовал простой второй созерцатель, если производительность не является большой проблемой.

matcher2 = re.compile(currency+r"[\s]*"+numbers) 

Обратите внимание, что регулярное выражение 'currency' не нужно создавать вручную. После того, как вы получите совпадение, вы можете получить доступ к соответствующему номеру группы (1 или 3), чтобы получить согласованную валюту. Например:

curren = m.group(1) 
    amount = m.group(2) 

Это возможно, поскольку все регулярное выражение «валюта» рассматривается как одна группа.

Если на вашем входе нет бесконечных моделей денежных представлений (возможно, невозможно), ваша проблема может быть решена с помощью соответствующих регулярных выражений.

+0

Чтобы сделать убедитесь, что вам не хватает некоторых строк, вы можете проверить предварительное скомпилированное регулярное выражение против денежных представлений в ваших примерах. Если строки отсутствуют, вы можете просто настроить регулярное выражение для их захвата. – erjoalgo

+1

Регулярные выражения Python не требуют обратного слэш перед операциями '(', '' 'и') '. – user4815162342

+0

Ах, ты прав. Я, вероятно, думал о регулярных выражениях стиля emacs. Но я уверен, что OP получает эту идею. – erjoalgo

3

Может ли человек даже узнать, является ли акроним валютой? если появляется новая валюта, то как она отличается от любого другого произвольного акронима? Скажите, что вы столкнулись с чем-то вроде «1000 CPU», как бы вы могли узнать, является ли это (или нет) валютой, если вы не знаете, что такое процессор?

Вы можете использовать обработку естественного языка, чтобы посмотреть на контекст вокруг числа, о котором идет речь, но это займет больше обработки, и вы никогда не узнаете наверняка.

Моя точка зрения: для этой проблемы машинное обучение является излишним, если оно даже применимо.

Зачем делать что-то трудное, когда значительно проще и точнее делать это по-другому?

+0

Нет, я не хочу, чтобы он изучал новые валюты из текста; Я бы добавил такой фрагмент данных вручную к данным обучения – Chris

+0

, так что разница между этим и наличием списка всех валют заранее? – Raufio

+0

То, что он действительно хотел, - это сделать крутое обучение машинам! – erjoalgo

0

Я просто хотел бы использовать регулярное выражение для извлечения грубо возможные пары:

import re 

test = '''Lorem ipsum dolor sit amet, 100.000,00 USD sadipscing elitr, sed diam nonumy eirmod 
GBP 400 ut labore et dolore magna aliquyam erat, sed diam voluptua. At USD 20 eos et 
accusam et justo duo dolores et 100,000.00 USD ea rebum. Stet 3,-- USD gubergren, no''' 

number = r'([\d+.,]+)' 
currency = r'([A-Z]{2,3})' 

r1 = re.compile(number + r'\s+' + currency) 
r2 = re.compile(currency + r'\s+' + number) 

matches = r1.findall(test) + r2.findall(test) 

print(matches) 

я получаю:

[('100.000,00', 'USD'), ('100,000.00', 'USD'), ('GBP', '400'), ('USD', '20')] 

Оттуда вы можете разобрать цифры и отфильтровать валюты, которые не существуют. У вас есть только пять или шесть возможных форматов, поэтому для вас здесь не может быть машинного обучения.

+0

Действительно лучше предварительно определить валютные купюры: ваш собеседник будет обрабатывать любые 2-3 буквы в качестве номинала. См. Мой ответ ниже. – erjoalgo

+0

@ealfonso: Не так много буквенных строчек из 2-3 букв, которые находятся рядом с числом. Я обычно сохраняю регулярное выражение простым и отфильтровываю неудачные совпадения позже. – Blender

+1

Его ввод кажется случайным, поэтому может быть много не-валютных 2-3 буквенных слов. Поскольку список кодов валют легко доступен, я бы это использовал. – erjoalgo