Применить строку непосредственно в шаблоне NLTK - PullRequest
0 голосов
/ 28 мая 2018

Я новичок в NLTK, я пытаюсь получить названия компаний из строки.Это код, который я написал.Но это не дает вывод. Можно ли дать значение String непосредственно в шаблонах?Кто-нибудь может мне помочь, пожалуйста.Заранее спасибо

from nltk.tokenize import sent_tokenize, word_tokenize
from nltk import pos_tag,RegexpParser
text="CompanyName1 GmbH is from Germany. CompanyName2 Inc is from America. ComapnyName3 corp is from India."
pattern = r"""
P: {<NNP>+<GmbH|Inc|corp>}
"""
for sent in sent_tokenize(text):
   sentence = sent.split()
   print("Parts of speech :",pos_tag(sentence))
   PChunker = RegexpParser(pattern)
   output= PChunker.parse(pos_tag(sentence))
   for subtree in output.subtrees(filter=lambda t: t.label() == 'P'):
     # print(subtree)
     print(' '.join([x[0] for x in subtree]))

1 Ответ

0 голосов
/ 28 мая 2018

Здесь вы можете объединить функции регулярного выражения и NLTK.

import re
...
text="CompanyName1 GmbH is from Germany. CompanyName2 Inc is from America. Comapny Name3 corp is from India."
for sent in  sent_tokenize(text):
    tagged = pos_tag(word_tokenize(sent))
    joined = ' '.join(["{}<{}>".format(word,tag) for word,tag in tagged])
    print([x.strip().replace("<NNP>", "") for x in re.findall(r'((?:\S+<NNP> )+)(?:GmbH|Inc|corp)<NN[^>]*>', joined)])
    print('-------- NEXT SENTENCE ----------')

Это приводит к выводу:

['CompanyName1']
-------- NEXT SENTENCE ----------
['CompanyName2']
-------- NEXT SENTENCE ----------
['Comapny Name3']
-------- NEXT SENTENCE ----------

Часть joined = ' '.join(["{}<{}>".format(word,tag) for word,tag in tagged]) создает временное предложение с тегами, добавляемыми к словам.Регулярное выражение: ((?:\S+<NNP> )+)(?:GmbH|Inc|corp)<NN[^>]*>, оно соответствует

  • ((?:\S+<NNP> )+) - Захват группы 1 (будет выводом re.findall): 1 или более непробельных символов, за которыми следуют <NNP> ипробел, все повторяются 1 или более раз (из-за +)
  • (?:GmbH|Inc|corp) - группа без захвата, которая соответствует любой из 3 альтернатив (| - альтернативный оператор)
  • <NN[^>]*> - a <NN + любые 0 или более символов, отличных от >, а затем >.

Чтобы получить окончательный результат, теги следует удалитьиз названий компаний, поэтому вы можете просто использовать x.strip().replace("<NNP>", "") - убрать пробел из начала / конца найденного совпадения и удалить тег <NNP>, используя простой метод str.replace.

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