NLP,空间:提高文档相似性的策略

tmo*_*tmo 3 nlp similarity spacy

一句话背景:我有来自自动转录谈话的文本数据,并且我想比较它们在内容上的相似性(例如,他们在说什么)以进行聚类和推荐。我对NLP很陌生。


数据:我正在使用的数据在这里可用。对于所有懒惰的人

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
Run Code Online (Sandbox Code Playgroud)

方法:到目前为止,我仅使用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)))
Run Code Online (Sandbox Code Playgroud)

问题实际上所有相似度均大于0.95。这或多或少与基线无关。现在,由于缺乏预处理,这可能不足为奇。


解决方案策略:按照这篇文章中的建议,我想执行以下操作(在可能的情况下使用spaCy):1)删除停用词。2)删除最常用的单词。3)合并单词对。4)可能在spaCy之外使用Doc2Vec。


问题:以上内容似乎是一种合理的策略吗?如果否,缺少什么?如果是,那么通过使用预加载的模型在引擎盖下已经发生了多少nlp = spacy.load('en_core_web_lg')呢?

我似乎找不到说明这些模型到底在做什么或如何配置的文档。一个快速谷歌搜索得到什么,甚至,很整齐,API文档似乎没有帮助呢。也许我找错地方了?

Nov*_*vak 5

您可以使用SpaCY和一些正则表达式来完成大多数操作。

因此,您必须看一下SpaCY API 文档

任何NLP管道中的基本步骤如下:

  1. 语言检测(不言自明,如果您正在使用某些数据集,则可以知道语言是什么,然后可以根据需要调整管道)。如果您知道一种语言,则必须从SpaCY下载正确的模型。说明在这里。在此示例中,使用英语。在命令行中,键入python -m spacy download en,然后将其导入到预处理脚本中,如下所示:

    import spacy
    nlp = spacy.load('en')
    
    Run Code Online (Sandbox Code Playgroud)
  2. 标记化-这是将文本拆分为单词的过程。仅这样做是不够的text.split()(例如,there's将被视为一个单词,但实际上是两个单词thereis)。因此,这里我们使用分词器。在SpaCy中,您可以执行以下操作:

    nlp_doc = nlp(text)
    
    Run Code Online (Sandbox Code Playgroud)

text您的数据集语料库或数据集中的样本在哪里?您可以在此处阅读有关文档实例的更多信息

  1. 删除标点符号-自我说明的过程,由上一步中的方法完成。要删除标点符号,只需键入:

    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]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 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./.
    
    Run Code Online (Sandbox Code Playgroud)

其中斜杠后的大写代码是标准文字标签。标签列表可以在这里找到

在SpaCy中,已经通过将文本放入nlp实例中来完成此操作。您可以通过以下方式获取标签:

    for token in doc:
        print(token.text, token.tag_)
Run Code Online (Sandbox Code Playgroud)
  1. 词法处理:词形去除-这是将单词转换为语言有效的基本形式(称为词缀)的过程:

    nouns ? singular nominative form
    verbs ? infinitive form
    adjectives ? singular, nominative, masculine, indefinitive, positive form
    
    Run Code Online (Sandbox Code Playgroud)

在SpaCy中,通过将文本放入nlp实例中已经为您完成了工作。您可以通过以下方式获得每个单词的引理:

    for token in doc:
        print(token.text, token.lemma_)
Run Code Online (Sandbox Code Playgroud)
  1. 删除停用词-停用词是不会给句子带来任何新信息或新含义的词,可以省略。您猜到了,它已经为您nlp实例化了。要过滤停用词,只需键入:

    text_without_stopwords = [token.text for token in doc if not token.is_stop]
    doc = nlp(' '.join(text_without_stopwords))
    
    Run Code Online (Sandbox Code Playgroud)

现在您有了一个干净的数据集。您现在可以使用word2vec手套预训练的模型来创建一个词矢量和输入数据到一些模型。或者,您可以使用TF-IDF通过删除最常见的单词来创建单词向量。另外,与通常的过程相反,您可能想保留最具体的词,因为您的任务是更好地区分两个文本。我希望这足够清楚:)