Фрагментирование предложений с использованием слова «но» с помощью RegEx - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь разбить предложения на части с использованием RegEx на слово «но» (или на любые другие слова с координированным соединением).Это не работает ...

sentence = nltk.pos_tag(word_tokenize("There are no large collections present but there is spinal canal stenosis."))
result = nltk.RegexpParser(grammar).parse(sentence)
DigDug = nltk.RegexpParser(r'CHUNK: {.*<CC>.*}')
for subtree in DigDug.parse(sentence).subtrees(): 
    if subtree.label() == 'CHUNK': print(subtree.node())

Мне нужно разделить предложение "There are no large collections present but there is spinal canal stenosis." на два:

1. "There are no large collections present"
2. "there is spinal canal stenosis."

Я также хочу использовать один и тот же код для разделения предложений в 'ии другие слова координирующего соединения (СС).Но мой код не работает.Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Если вы хотите избежать жесткого кодирования слов в сочетании, таких как «но», «и» и «попробуйте чинкировать вместе с чанкингом:


import nltk
Digdug = nltk.RegexpParser(r""" 
CHUNK_AND_CHINK:
{<.*>+}          # Chunk everything
}<CC>+{      # Chink sequences of CC
""")
sentence = nltk.pos_tag(nltk.word_tokenize("There are no large collections present but there is spinal canal stenosis."))

result = Digdug.parse(sentence)

for subtree in result.subtrees(filter=lambda t: t.label() == 
'CHUNK_AND_CHINK'):
            print (subtree)

Чингинг в основном исключает то, что нам не нужно, из фразы чанка -«но» в этом случае.Для получения более подробной информации см .: http://www.nltk.org/book/ch07.html

0 голосов
/ 25 августа 2018

Я думаю, вы можете просто сделать

import re
result = re.split(r"\s+(?:but|and)\s+", sentence)

, где

`\s`        Match a single character that is a "whitespace character" (spaces, tabs, line breaks, etc.)
`+`         Between one and unlimited times, as many times as possible, giving back as needed (greedy)
`(?:`       Match the regular expression below, do not capture
            Match either the regular expression below (attempting the next alternative only if this one fails)
  `but`     Match the characters "but" literally
  `|`       Or match regular expression number 2 below (the entire group fails if this one fails to match)
  `and`     Match the characters "and" literally
)
`\s`        Match a single character that is a "whitespace character" (spaces, tabs, line breaks, etc.)
`+`         Between one and unlimited times, as many times as possible, giving back as needed (greedy)

Вы можете добавить больше соединительных слов, разделенных символом |. Обратите внимание, что эти слова не содержат символов, которые имеют особое значение в регулярном выражении. Если сомневаетесь, сначала убегите от них, набрав re.escape(word)

...