Почему результаты сопоставления отличаются, например, от r '\ b (? :( can) | (могли)) \ b' и r '(\ bcan \ b) | (\ bcould \ b)'? - PullRequest
0 голосов
/ 22 июня 2019

r'\b(?:(can)|(could))\b' намного быстрее, чем r'(\bcan\b)|(\bcould\b)'.Это имеет смысл, поскольку первый шаблон начинает выглядеть за пределами слов и является более эффективным.Что меня озадачивает, так это то, что эти два шаблона генерируют немного разные результаты с re.findall для моих списков ключевых слов и документов.Изменение кода делает сопоставление намного быстрее, но я не могу повторить свои предыдущие результаты.

Эти две модели кажутся мне эквивалентными, за исключением разницы в эффективности.Я что-то упустил?

Мой шаблон выглядит следующим образом, и его можно найти ЗДЕСЬ Входные данные слишком велики для публикации.Это текстовые файлы, содержащие десятки тысяч слов.

\b(?:(Anti-takeover (?:provisions|provision))|(Bank debt[s]?)|(Capital 
(?:expenditure|expenditures))|(Capital (?:lease|leases))|(Chapter 11)| 
(Chapter 7)|(Chapter 9)|(Collateral[s]?)|(Concentrated ownership[s]?)| 
(Covenant|covenants)|(Credit (?:facility|facilities))|(Credit rating[s]?)| 
(Credit risk[s]?)|(Debt burden[s]?)|(Decline in stock price[s]?)| 
(Default[s]?|defaulted)|(Defined Benefit[s]?)|(Dilution[s]?)|(Dividend[s]?)| 
(Downgrade[s]?)|(Family)|(Financial condition[s]?)|(Financing cost[s]?)| 
(Funded status)|(Illiquid market[s]?)|(Improvements)|(Indebtedness)|(Insider 
sales)|(Investment[s]? in equipment)|(Investment[s]? in plant[s]?)|(Lease 
(?:commitment|commitments))|(lease|leases|leasing)|(Leverage[s]?)| 
(Leveraged (?:lease|leases))|(Limited trading)|(Liquidity|Liquidities)| 
(Loan[s]?)|(Locked-in (?:lease|leases))|(Mandatory contribution[s]?)| 
(Maturity|maturities)|(Negative operating cash flow[s]?)|(New financing)|(? 
-i:O.P.E.B.)|(Obligations)|(?-i:OPEB)|(Operating losses)|(Penny stock[s]?)| 
(Postretirement[s]?)|(Rating[s]?)|(Refinance)|(Refinancing)|(Reinsurance)| 
(Renegotiation[s]?)|(Reorganization[s]?)|(Reserves)|(Revolver[s]?)|(Sale 
of productive assets)|(Stock market listing)|(Stock price 
(?:volatility|volatilities))|(Stock price drop[s]?)|(Underfunded 
 pensions)|(Underwriting)|(Volatility of operating results)|(Volatility of 
 revenues)|(Volatility of sales)|(Working capital[s]?))\b

Я понимаю, что регулярное выражение не элегантно.Он был создан из списка ключевых слов.Некоторые ключевые слова находятся в смешанных формах, таких как «положения | предоставление»."Положение [s]?"или просто "провизия"?было бы лучше.Я сделал некоторые изменения, но не все.Первоначально он был сгенерирован:

re_fin = '|'.join(r'((?-i:\b{}\b))'.format(k) if k.upper() == k else 
        r'(\b{}\b)'.format(k) for k in keywords])

Я обнаружил, что это очень медленно, и изменил его на следующее (чтобы показать все шаги):

  patterns = [r"(?-i:{})".format(k) if k.upper() == k else r"({})".format(k) 
            for k in keywords]
  patterns = "|".join(patterns)
  patterns = r"\b(?:{})\b".format(patterns)

1 Ответ

0 голосов
/ 22 июня 2019

Я разобрался, это из-за проблемы с группировкой.

templates = [r "(? - i: {})". Format (k), если k.upper () == k else r "({})". Format (k) для k в ключевых словах]

Ключевые слова all-CAP не были сгруппированы, поэтому не были перехвачены re.findall. (? -i: {}) должно было быть (? -i: ({}))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...