Есть ли способ добавить 2 или более повторений тега в предложение с тегом, используя nltk? - PullRequest
3 голосов
/ 12 июля 2011

Я пытаюсь использовать модуль nltk в python для объединения воедино любых случаев, когда в последовательности встречаются от двух до пяти существительных.

Это код, который я использую:

parse_pattern  = "Keyword: {< N>{2,5}}"
keyword_parser = nltk.RegexpParser(parse_pattern)
result = keyword_parser.parse(sentence)

Я понимаю, что этот бит должен помочь: Keyword: {< N>{2,5}}

Я даже нашел пример в книге «Обработка естественного языка с Python», в которой вышеприведенный бит полностью аналогично используется: NOUNS: {< N.*>{4,}}, где авторы объясняют, что этот бит кода должен содержать 4 или более существительных.

Однако я получаю сообщение об ошибке при запуске приведенного выше кода:

ValueError: Illegal chunk pattern: {< N>{2,5}}

Примечание: я также попробовал вышеупомянутое, используя {< N.*>{2,5}} (с точечной звездой исключительно потому, что автор вышеупомянутой книги сделал) без удачи.

Любая помощь в том, как разбить два или более повторов тега, будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 12 июля 2011

Ошибка ValueError, вероятно, вызывается пробелом между открывающей угловой скобкой и символом N.

parse_pattern = "Keyword: {<N>{2,5}}" вместо
parse_pattern = "Keyword: {< N>{2,5}}"

Кроме того, не беспокойтесь об использовании синтаксиса с дополнительной точкой-звездочкой, поскольку это необходимо только в том случае, если вы пытаетесь сопоставить все теги, с которыми start , здесь N.

Если все не удалось, вы можете попробовать альтернативное выражение, которое не требует синтаксиса {min, max} для диапазона вхождений. parse_pattern = "Keyword: {<N><N><N>?<N>?<N>?}"

И если это даже не получится, возможно, попробуйте просто parse_pattern = "Keyword: {<N>}", мы надеемся, что что-то сработает, или иначе может помочь определить, что еще может быть не так с вашей настройкой.

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

ищите код пакета regex.py, метод tag_pattern2re_pattern (), функциональность которого преобразует tag_pattern в правильное регулярное выражение. Принимая во внимание, что постоянный параметр CHUNK_TAG_PATTERN является неизменным, который начинается с некоторого специального символа и заканчивается специальным символом, таким как '(' 、 '' 、 '<' 、 ')' 、 '>' 、 '>'. Таким образом, шаблон тега CHUNK:{<V.*><TO><V.*>} является правильным, но шаблон тега CHUNK:{<V>.*<TO><V.*>{1,}} является неправильным

0 голосов
/ 18 января 2014

nltk отмечает существительные со следующими тегами:

  • <NN> для имени существительного в единственном числе
  • <NNP> для имени существительного в единственном числе
  • <NNS>для существительного во множественном числе
  • <NNPS> для существительного во множественном числе

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

<NN.*>{2,5}

В вашем примере это будет:

parse_pattern  = "Keyword: {<NN.*>{2,5}}"
keyword_parser = nltk.RegexpParser(parse_pattern)
result         = keyword_parser.parse(sentence)

Обратите внимание, что sentence должен быть помечен, например,

sentence = [("dog", "NN"), ("David", "NNP"), ("cats", "NNS")]
...