首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spaCy -自定义模型上的文本处理

spaCy -自定义模型上的文本处理
EN

Stack Overflow用户
提问于 2020-05-22 12:16:54
回答 1查看 618关注 0票数 2

总的来说,我对机器学习和NLP非常陌生。我试图把我的头脑围绕着如何做适当的文本预处理(清洁文本)。

我已经建立了一个自定义文本分类模型,有两个标签:offensiveclean。在将所有输入文本提供给我的模型之前,我有下面的方法。(无论是在训练之前,还是在用于测试时)。

该方法将删除断句、标点符号和引文。

代码语言:javascript
复制
import spacy
from spacy.lang.en.stop_words import STOP_WORDS
import string

def normalize(text, lowercase, remove_stopwords, remove_punctuation):
    nlp = spacy.load("en_core_web_sm", disable=['parser', 'tagger', 'ner'])
    stops = spacy.lang.en.stop_words.STOP_WORDS

    if lowercase:
        text = text.lower()
    text = nlp(text)
    if remove_punctuation:
        text = [t for t in text if t.text not in string.punctuation]
    lemmatized = list()
    for word in text:
        lemma = word.lemma_.strip()
        if lemma:
            if not remove_stopwords or (remove_stopwords and lemma not in stops):
                lemmatized.append(lemma)

    return " ".join(lemmatized)

请考虑以下输入字符串:

输入:You're such a sweet person. All the best!

如果我用我的方法清理文本:

代码语言:javascript
复制
test_text = "You're such a sweet person. All the best!"
test_text = normalize(test_text, lowercase=True, remove_stopwords=True, remove_punctuation=True)

它将返回:-PRON- sweet person

现在,我已经用两个版本测试了我的模型,结果是:

You're such a sweet person. All the best

  • {'PROFANITY': 0.07376033067703247, 'CLEAN': 0.9841629266738892}

-PRON- sweet person

  • {'PROFANITY': 0.926033616065979, 'CLEAN': 0.010466966778039932}

正如你所看到的,结果差别很大。如果我不清理文本,在提供给模型之前,它会得到正确的污秽/干净分数。这篇文章不是亵渎的。

但是,如果我在提供给模型之前清理文本,那么亵渎/干净的分数是不正确的。

我做错了什么吗?我有一个大约18k行的数据集,它由带标签的句子组成。所有句子如下所示,在接受模型培训之前,将使用我的normalize方法进行清理:

代码语言:javascript
复制
IS_OFFENSIVE,TEXT
--------------------
1,you are a bitch!
0,you are very sweet!
0,I love you
1,"I think that is correct, idiot!"

编辑1

这是我训练我的模型的代码。

代码语言:javascript
复制
def convert():
    TRAINING_DATA = defaultdict(list)
    # Open CSV file.
    with open('train/profanity/data/profanity_cleaned_data_cleaned.csv', mode='r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        line_count = 1
        for row in csv_reader:
            if line_count > 0 and line_count < 500:
                if row['is_offensive'] == '0':
                    CLEAN = bool(1)
                    PROFANITY = bool(0)
                else:
                    CLEAN = bool(0)
                    PROFANITY = bool(1)

                TRAINING_DATA['csv'].append([str(row['text']), {
                    "CLEAN": CLEAN, "PROFANITY": PROFANITY}])

                line_count += 1

    return TRAINING_DATA['csv']

def train():
    output_dir = 'train/profanity/model/'
    TRAINING_DATA = convert_csv_to_dataset.convert()

    nlp = spacy.blank("en")
    category = nlp.create_pipe("textcat")
    category.add_label("PROFANITY")
    category.add_label("CLEAN")
    nlp.add_pipe(category)

    # Start the training
    nlp.begin_training()

    # Loop for 10 iterations
    for itn in range(10):
        # Shuffle the training data
        random.shuffle(TRAINING_DATA)
        losses = {}

        # Batch the examples and iterate over them
        for batch in tqdm(spacy.util.minibatch(TRAINING_DATA, size=1)):
            texts = [nlp(text) for text, entities in batch]
            annotations = [{"cats": entities} for text, entities in batch]
            nlp.update(texts, annotations, losses=losses)
        # if itn % 20 == 0:
        #    print(losses)

    nlp.to_disk(output_dir)
    print("Saved model to", output_dir)

文件profanity_cleaned_data_cleaned.csv已经使用normalize方法进行了预处理。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-22 18:16:36

看看您的规范化代码,您可能会删除这么多信息,并添加像-PRON-这样的元素,从而抛出模型。

You're such a sweet person. All the best! - 10代币

-PRON- sweet person -5代币(-PRON- -> - PRON -,三代币)

这意味着在“清理”版本中,超过一半的令牌是由这个-PRON-文本组成的。A.k.a.大多数输入都偏向于-PRON-文本,而swwet person几乎没有那么“重要”。

您的培训代码看起来很好,只要清洁后的csv是原始输入,使用相同的规范化功能清洗即可。

我建议进行以下修改

停止在清理后的文本中添加诸如

  1. normalize中的-PRON-语句,在if lemma条件中添加一个else语句,如果它没有一个引理,那么这个单词将被添加--这可能是导致大量文本被删除的原因,

H 117使用更多的数据进行培训,这一行意味着您将只处理最多500行,但您说您有~18k行来处理该文本:在从csv中读取它之前,不要清理文本,这样,就可以对您的规范化函数进行更改,而不必重新清理和保存一个新的csv.。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61954862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档