Любой эффективный способ найти окружение ADJ относительно целевой фразы в Python? - PullRequest
0 голосов
/ 15 ноября 2018

Я занимаюсь анализом настроений по заданным документам, моя цель в том, чтобы я хотел найти наиболее близкие или окружающие прилагательные слова относительно целевой фразы в моих предложениях. У меня есть идея, как извлечь окружающие слова относительно целевых фраз, но как мне найти относительно близкое или ближайшее прилагательное или NNP или VBN или другой тег POS относительно целевой фразы.

Вот набросок идеи о том, как заставить окружающие слова относиться к моей целевой фразе.

sentence_List= {"Obviously one of the most important features of any computer is the human interface.", "Good for everyday computing and web browsing.",
"My problem was with DELL Customer Service", "I play a lot of casual games online[comma] and the touchpad is very responsive"}

target_phraseList={"human interface","everyday computing","DELL Customer Service","touchpad"}

Обратите внимание, что мой исходный набор данных был задан как фрейм данных, в котором был дан список предложения и соответствующие целевые фразы. Здесь я просто смоделировал данные следующим образом:

import pandas as pd
df=pd.Series(sentence_List, target_phraseList)
df=pd.DataFrame(df)

Здесь я токенизирую предложение следующим образом:

from nltk.tokenize import word_tokenize
tokenized_sents = [word_tokenize(i) for i in sentence_List]
tokenized=[i for i in tokenized_sents]

затем я пытаюсь выяснить окружающие слова относительно моих целевых фраз, используя этот лут здесь . Тем не менее, я хочу выяснить относительно ближе или скрытнее adjective, или verbs или VBN относительно моей целевой фразы. Как я могу это сделать? Любая идея, чтобы сделать это? Спасибо

1 Ответ

0 голосов
/ 21 ноября 2018

Хотелось бы что-нибудь для вас? Я признаю, что необходимо сделать некоторые изменения, чтобы сделать это полностью полезным (проверка на верхний / нижний регистр; он также будет возвращать слово вперед в предложении, а не слово позади, если есть связь), но, надеюсь, это полезно достаточно, чтобы начать:

import nltk
from nltk.tokenize import MWETokenizer

def smart_tokenizer(sentence, target_phrase):
    """
    Tokenize a sentence using a full target phrase.
    """
    tokenizer = MWETokenizer()
    target_tuple = tuple(target_phrase.split())
    tokenizer.add_mwe(target_tuple)
    token_sentence = nltk.pos_tag(tokenizer.tokenize(sentence.split()))

    # The MWETokenizer puts underscores to replace spaces, for some reason
    # So just identify what the phrase has been converted to
    temp_phrase = target_phrase.replace(' ', '_')
    target_index = [i for i, y in enumerate(token_sentence) if y[0] == temp_phrase]
    if len(target_index) == 0:
        return None, None
    else:
        return token_sentence, target_index[0]


def search(text_tag, tokenized_sentence, target_index):
    """
    Search for a part of speech (POS) nearest a target phrase of interest.
    """
    for i, entry in enumerate(tokenized_sentence):
        # entry[0] is the word; entry[1] is the POS
        ahead = target_index + i
        behind = target_index - i
        try:
            if (tokenized_sentence[ahead][1]) == text_tag:
                return tokenized_sentence[ahead][0]
        except IndexError:
            try:
                if (tokenized_sentence[behind][1]) == text_tag:
                    return tokenized_sentence[behind][0]
            except IndexError:
                continue

x, i = smart_tokenizer(sentence='My problem was with DELL Customer Service',
                       target_phrase='DELL Customer Service')
print(search('NN', x, i))

y, j = smart_tokenizer(sentence="Good for everyday computing and web browsing.",
                       target_phrase="everyday computing")
print(search('NN', y, j))

Редактировать: Я внес некоторые изменения, чтобы решить проблему использования целевой фразы произвольной длины, как вы можете видеть в функции smart_tokenizer. Ключ здесь - класс nltk.tokenize.MWETokenizer (подробнее см .: Python: токенизация с фразами ). Надеюсь, это поможет. Кроме того, я бы оспаривал идею, что spaCy является обязательно более элегантным - в какой-то момент кто-то должен написать код, чтобы выполнить работу. Это будут либо разработчики spaCy, либо вы, когда вы создаете собственное решение. Их API довольно сложен, поэтому я оставлю это упражнение вам.

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