шаблон регулярных выражений для токенизации предложения при удалении конца пунктуации? - PullRequest
1 голос
/ 19 февраля 2020

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

"This is a test sentence. I won't write this sentence. J. Smith lives in the U.S.A. and it is nice there."

должен возвращаться как

["This" "is" "a" "test" "sentence" "." "I" "won't" "write" "this" "sentence" "." "J." "Smith" "lives" 
 "in" "the" "U.S.A." "and" "it" "is" "nice" "there" ."]

Мой код в настоящее время:

tokens = re.findall(r'((\.\s)|(\S+))', sentence)

Но это не работает правильно. Соответствует периоду в конце слова как части слова.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2020

Вы можете использовать [^\s.]{2,}|(?:\w|\.)+ для маркировки этого конкретного примера, но, как упоминает Райан, без инструментария естественного языка, это бесполезное упражнение.

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

  1. [^\s.]{2,} соответствует 2 или более последовательным непробельным символам не буквального периода
  2. (?:\w|\.)+ соответствует одному или нескольким последовательным символам слова или буквенным периодам

Использование:

import re

s = """This is a test sentence. 
I won't write this sentence. J. Smith lives in the U.S.A.  and it is nice there.
"""

for token in re.findall(r"[^\s.]{2,}|(?:\w|\.)+", s):
    print(repr(token))

Выход:

'This'
'is'
'a'
'test'
'sentence'
'.'
'I'
"won't"
'write'
'this'
'sentence'
'.'
'J.'
'Smith'
'lives'
'in'
'the'
'U.S.A.'
'and'
'it'
'is'
'nice'
'there'
'.'
1 голос
/ 19 февраля 2020

Это невозможно с регулярным выражением. Невозможно отличить слова, содержащие знаки препинания («J.» в вашем примере или «младший» - это слово, которое не является единичным символом), где вы хотите, чтобы знаки препинания были частью токена, от слов, за которыми следовала пунктуация («предложение»). . "в вашем примере), где вы хотите использовать пунктуацию в качестве собственного токена.

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

Может можно разработать некоторую эвристику, такую ​​как длина слова и следовать ли за ней слово с заглавной буквой, или общие слова из белого списка, которые нарушают правила, но у вас будут проблемы, делающие эту работу надежной.

0 голосов
/ 19 февраля 2020

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

([A-Z]\.\S*|\w+\'*\w*|[A-Z]\.|\.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...