2016-08-31 6 views
2

ввода текста всегда список имен блюдо, где есть 1 ~ 3 прилагательные и существительноеКак генерировать би/три-грамм с использованием Spacy/NLTK

Входы

thai iced tea 
spicy fried chicken 
sweet chili pork 
thai chicken curry 

выходы:

thai tea, iced tea 
spicy chicken, fried chicken 
sweet pork, chili pork 
thai chicken, chicken curry, thai curry 

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

И я хотел бы добиться этого с чудной или NLTK

+0

См http://stackoverflow.com/a/ 34742540/610569 и http: // stackoverflow.com/questions/17531684/n-grams-in-python-four-five-six-grams – alvas

ответ

3

Вы можете достичь этого в несколько этапов с NLTK:

  1. PoS помечать последовательности

  2. создания желаемого п -грамм (в ваших примерах нет триграмм, но пропущенных грамм, которые могут быть сгенерированы через триграммы, а затем выбивают средний токен)

  3. отбросить все n-граммы, которые не соответствуют шаблону JJ NN.

Пример:

def jjnn_pairs(phrase): 
    ''' 
    Iterate over pairs of JJ-NN. 
    ''' 
    tagged = nltk.pos_tag(nltk.word_tokenize(phrase)) 
    for ngram in ngramise(tagged): 
     tokens, tags = zip(*ngram) 
     if tags == ('JJ', 'NN'): 
      yield tokens 

def ngramise(sequence): 
    ''' 
    Iterate over bigrams and 1,2-skip-grams. 
    ''' 
    for bigram in nltk.ngrams(sequence, 2): 
     yield bigram 
    for trigram in nltk.ngrams(sequence, 3): 
     yield trigram[0], trigram[2] 

Продлить шаблон ('JJ', 'NN') и желаемый п-грамм для ваших потребностей.

Я думаю, что нет необходимости в синтаксическом разборе. Основная проблема этого подхода, однако, заключается в том, что большинство маркеров PoS, вероятно, не будут помечать все так, как вы хотите. Например, PoS по умолчанию Таггер моей установки NLTK помечено «чили», как Н.Н., не JJ и «жареный» получил ВБД. Разбор не поможет вам, хотя!

0

Нечто подобное:

>>> from nltk import bigrams 
>>> text = """thai iced tea 
... spicy fried chicken 
... sweet chili pork 
... thai chicken curry""" 
>>> lines = map(str.split, text.split('\n')) 
>>> for line in lines: 
...  ", ".join([" ".join(bi) for bi in bigrams(line)]) 
... 
'thai iced, iced tea' 
'spicy fried, fried chicken' 
'sweet chili, chili pork' 
'thai chicken, chicken curry' 

В качестве альтернативы с помощью colibricorehttps://proycon.github.io/colibri-core/doc/#installation; Р

+1

Эй, Альвас, я стараюсь избегать прилагательного-прилагательного. например в частности, пытаясь избежать «пряного жаренья», – samol

0

Я использовал Spacy 2.0 с английской модели. Ваш вход:

s = ["thai iced tea", 
"spicy fried chicken", 
"sweet chili pork", 
"thai chicken curry",] 

Spacy решение: функция

import spacy 
nlp = spacy.load('en') # import spacy, load model 

def noun_notnoun(phrase): 
    doc = nlp(phrase) # create spacy object 
    token_not_noun = [] 
    notnoun_noun_list = [] 

    for item in doc: 
     if item.pos_ != "NOUN": # separate nouns and not nouns 
      token_not_noun.append(item.text) 
     if item.pos_ == "NOUN": 
      noun = item.text 

    for notnoun in token_not_noun: 
     notnoun_noun_list.append(notnoun + " " + noun) 

    return notnoun_noun_list 

Вызов:

for phrase in s: 
    print(noun_notnoun(phrase)) 

Результаты:

['thai tea', 'iced tea'] 
['spicy chicken', 'fried chicken'] 
['sweet pork', 'chili pork'] 
['thai chicken', 'curry chicken'] 

 Смежные вопросы

  • Нет связанных вопросов^_^