Здесь вы можете объединить функции регулярного выражения и 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
.