2015-12-04 14 views
5

Tôi đã viết regex sau vào thẻ cụm từ khuôn mẫu nhất địnhLàm thế nào để sử dụng mẫu nexk regex để trích xuất một đoạn cụm từ cụ thể?

pattern = """ 
     P2: {<JJ>+ <RB>? <JJ>* <NN>+ <VB>* <JJ>*} 
     P1: {<JJ>? <NN>+ <CC>? <NN>* <VB>? <RB>* <JJ>+} 
     P3: {<NP1><IN><NP2>} 
     P4: {<NP2><IN><NP1>} 

    """ 

mô hình này sẽ tag một cách chính xác một cụm từ như:

a = 'The pizza was good but pasta was bad' 

và cung cấp cho các đầu ra mong muốn với 2 giai đoạn:

  1. pizza là tốt
  2. mì ống là xấu

Tuy nhiên, nếu câu của tôi là một cái gì đó như:

a = 'The pizza was awesome and brilliant' 

trận đấu chỉ có cụm từ:

'pizza was awesome' 

thay vì mong muốn:

'pizza was awesome and brilliant' 

Làm thế nào để kết hợp mẫu regex cho ví dụ thứ hai của tôi?

+0

Ngôn Ngữ là gì, Tôi không nghĩ rằng bạn có thể tất cả 'pizza là tốt' một cụm từ danh từ, cũng không phải là một cụm từ động từ kể từ khi bạn bỏ định nghĩa. Nó giống như một số cấu trúc cụm từ mà bạn muốn trích xuất. – alvas

+0

Về cơ bản, tôi muốn có cụm từ mô tả món ăn trong các bài đánh giá. Không phải là một cụm từ danh từ. Đã chỉnh sửa câu hỏi của tôi! – pd176

+0

Đừng lo, tôi có được những gì bạn đang làm. Đó là để phân tích tình cảm phải không? Tôi đang viết một câu trả lời =) Bạn có thực sự muốn giữ nguyên định lý không? – alvas

Trả lời

9

Trước hết, chúng ta hãy nhìn vào các thẻ POS rằng NLTK cho:

>>> from nltk import pos_tag 
>>> sent = 'The pizza was awesome and brilliant'.split() 
>>> pos_tag(sent) 
[('The', 'DT'), ('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')] 
>>> sent = 'The pizza was good but pasta was bad'.split() 
>>> pos_tag(sent) 
[('The', 'DT'), ('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ'), ('but', 'CC'), ('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')] 

(Lưu ý: Trên đây là những kết quả từ NLTK v3.1 pos_tag, phiên bản cũ có thể khác nhau)

Những gì bạn muốn chụp về cơ bản là:

  • NN VBD JJ CC JJ
  • NN VBD JJ

Vì vậy, hãy bắt chúng với những mẫu:

>>> from nltk import RegexpParser 
>>> sent1 = ['The', 'pizza', 'was', 'awesome', 'and', 'brilliant'] 
>>> sent2 = ['The', 'pizza', 'was', 'good', 'but', 'pasta', 'was', 'bad'] 
>>> patterns = """ 
... P: {<NN><VBD><JJ><CC><JJ>} 
... {<NN><VBD><JJ>} 
... """ 
>>> PChunker = RegexpParser(patterns) 
>>> PChunker.parse(pos_tag(sent1)) 
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')])]) 
>>> PChunker.parse(pos_tag(sent2)) 
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ')]), ('but', 'CC'), Tree('P', [('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')])]) 

Vì vậy, đó là "lừa dối" bởi hardcoding !!!

Hãy quay trở lại với mô hình POS:

  • NN VBD JJ CC JJ
  • NN VBD JJ

có thể được đơn giản hóa để:

  • NN VBD JJ (CC JJ)

Vì vậy, bạn có thể sử dụng toán tử tùy chọn trong regex, ví dụ::

>>> patterns = """ 
... P: {<NN><VBD><JJ>(<CC><JJ>)?} 
... """ 
>>> PChunker = RegexpParser(patterns) 
>>> PChunker.parse(pos_tag(sent1)) 
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('awesome', 'JJ'), ('and', 'CC'), ('brilliant', 'JJ')])]) 
>>> PChunker.parse(pos_tag(sent2)) 
Tree('S', [('The', 'DT'), Tree('P', [('pizza', 'NN'), ('was', 'VBD'), ('good', 'JJ')]), ('but', 'CC'), Tree('P', [('pasta', 'NN'), ('was', 'VBD'), ('bad', 'JJ')])]) 

lẽ Hầu hết các bạn đang sử dụng các tagger cũ, đó là lý do tại sao mô hình của bạn là khác nhau nhưng tôi đoán bạn xem làm thế nào bạn có thể nắm bắt những cụm từ bạn cần sử dụng ví dụ trên.

Các bước thực hiện:

  • Thứ nhất, kiểm tra các mô hình POS sử dụng pos_tag
  • Sau đó khái quát mô hình và đơn giản hóa chúng
  • Sau đó đặt chúng vào RegexpParser
+0

cảm ơn rất nhiều. Chính xác những gì tôi cần :) – pd176

Các vấn đề liên quan