NLP, spaCy: стратегия улучшения сходства документов - PullRequest
0 голосов
/ 07 июня 2018

Фон одного предложения : у меня есть текстовые данные из автоматически транскрибированных выступлений, и я хочу сравнить их сходство по содержанию (например, о чем они говорят), чтобы выполнить кластеризацию и рекомендации.Я совершенно новичок в НЛП.


Данные : Используемые мной данные доступны здесь .Для всех ленивых

clone https://github.com/TMorville/transcribed_data

и вот фрагмент кода, чтобы поместить его в df:

import os, json
import pandas as pd

from pandas.io.json import json_normalize 

def td_to_df():

    path_to_json = '#FILL OUT PATH'
    json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('td.json')]

    tddata = pd.DataFrame(columns=['trans', 'confidence'])

    for index, js in enumerate(json_files):
        with open(os.path.join(path_to_json, js)) as json_file:
            json_text = json_normalize(json.load(json_file))

            tddata['trans'].loc[index] = str(json_text['trans'][0])
            tddata['confidence'].loc[index] = str(json_text['confidence'][0])

    return tddata

Подход: До сих пор я использовал пакет spaCy только для того, чтобы сделать сходство «из коробки».Я просто применяю модель nlp ко всему корпусу текста и сравниваю ее со всеми остальными.

def similarity_get():

    tddata = td_to_df()

    nlp = spacy.load('en_core_web_lg')

    baseline = nlp(tddata.trans[0])

    for text in tddata.trans:
        print (baseline.similarity(nlp(text)))

Задача : Практически все сходства проявляются как> 0,95 .Это более или менее независимо от базовой линии.Теперь, это может не стать большим сюрпризом, учитывая отсутствие предварительной обработки.


Стратегия решения : Следуя совету в этом посте , я бы хотелвыполните следующие действия (используя spaCy, где это возможно): 1) Удалите стоп-слова.2) Удалить наиболее часто встречающиеся слова.3) Слияние пар слов.4) Возможно, используйте Doc2Vec вне spaCy.


Вопросы : Похоже ли это на разумную стратегию?Если нет, то чего не хватает?Если да, то сколько из этого уже происходит под капотом при использовании предварительно обученной модели, загруженной в nlp = spacy.load('en_core_web_lg')?

Я не могу найти документацию, которая демонстрирует, что именно делают эти модели, или как это настроить. быстрый поиск в Google ничего не дает и даже очень аккуратная документация API , похоже, не помогает.Возможно, я смотрю не в том месте?

1 Ответ

0 голосов
/ 28 января 2019

Вы можете сделать большую часть этого с SpaCY и некоторыми регулярными выражениями.

Итак, вам нужно взглянуть на документацию SpaCY API .

Основные шаги в любом конвейере NLP:

  1. Определение языка (самоочевидно, если вы работаете с каким-либо набором данных, вы знаете, что такое язык, и вы можете адаптировать его)твой трубопровод к этому).Когда вы знаете язык, вы должны загрузить правильные модели из SpaCY.Инструкции здесь .Давайте использовать английский для этого примера.В командной строке просто введите python -m spacy download en и затем импортируйте его в сценарий предварительной обработки, например:

    import spacy
    nlp = spacy.load('en')
    
  2. Токенизация - это процесс разбиения текста на слова.Недостаточно просто сделать text.split() (например, there's будет рассматриваться как одно слово, но на самом деле это два слова there и is).Так что здесь мы используем токенизаторы.В SpaCy вы можете сделать что-то вроде:

    nlp_doc = nlp(text)
    

, где text - ваш корпус набора данных или образец из набора данных.Вы можете прочитать больше об экземпляре документа здесь

Удаление пунктуации - довольно понятный процесс, выполняемый методом на предыдущем шаге.Чтобы удалить знаки препинания, просто наберите:

import re

# removing punctuation tokens
text_no_punct = [token.text for token in doc if not token.is_punct]

# remove punctuation tokens that are in the word string like 'bye!' -> 'bye'
REPLACE_PUNCT = re.compile("(\.)|(\;)|(\:)|(\!)|(\')|(\?)|(\,)|(\")|(\()|(\))|(\[)|(\])")
text_no_punct = [REPLACE_PUNCT.sub("", tok.text) for tok in text_no_punct]

POS-теги - сокращение от части речи.Это процесс разметки слова в тексте как соответствующей определенной части речи.Например:

A/DT Part-Of-Speech/NNP Tagger/NNP is/VBZ a/DT piece/NN of/IN
software/NN that/WDT reads/VBZ text/NN in/IN some/DT
language/NN and/CC assigns/VBZ parts/NNS of/IN speech/NN to/TO
each/DT word/NN ,/, such/JJ as/IN noun/NN ,/, verb/NN ,/,
adjective/NN ,/, etc./FW./.

, где прописные коды после косой черты являются стандартными тегами слова.Список тегов можно найти здесь

В SpaCy это уже делается путем помещения текста в экземпляр nlp.Вы можете получить теги с:

    for token in doc:
        print(token.text, token.tag_)

Морфологическая обработка: лемматизация - это процесс преобразования слов в лингвистически обоснованную базовую форму, называемую леммой:

nouns → singular nominative form
verbs → infinitive form
adjectives → singular, nominative, masculine, indefinitive, positive form

В SpaCy это также ужесделано для вас, поместив текст в nlp экземпляр.Вы можете получить лемму каждого слова:

    for token in doc:
        print(token.text, token.lemma_)

Удаление стоп-слов - стоп-слова - это слова, которые не вносят никакой новой информации или значения в предложение и могут быть опущены.Как вы уже догадались, это уже сделано для вас nlp экземпляром.Чтобы отфильтровать стоп-слова, просто наберите:

text_without_stopwords = [token.text for token in doc if not token.is_stop]
doc = nlp(' '.join(text_without_stopwords))

Теперь у вас есть чистый набор данных.Теперь вы можете использовать word2vec или GloVe предварительно обученные модели для создания векторов слов и ввода данных в некоторую модель.Кроме того, вы можете использовать TF-IDF для создания векторов слов, удаляя наиболее распространенные слова.Кроме того, в отличие от обычного процесса, вы можете оставить самые конкретные слова, так как ваша задача - лучше различать два текста.Я надеюсь, что это достаточно ясно:)

...