如何将标记化中的多词名称保持在一起?

Posted

技术标签:

【中文标题】如何将标记化中的多词名称保持在一起?【英文标题】:How can I keep multi-word names in tokenization together? 【发布时间】:2020-02-06 12:31:42 【问题描述】:

我想使用 TF-IDF 功能对文档进行分类。一种方法:

from sklearn.feature_extraction.text import TfidfVectorizer
import string
import re
import nltk


def tokenize(document):
    document = document.lower()
    for punct_char in string.punctuation:
        document = document.replace(punct_char, " ")
    document = re.sub('\s+', ' ', document).strip()

    tokens = document.split(" ")

    # Contains more than I want:
    # from spacy.lang.de.stop_words import STOP_WORDS
    stopwords = nltk.corpus.stopwords.words('german')
    tokens = [token for token in tokens if token not in stopwords]
    return tokens

# How I intend to use it
transformer = TfidfVectorizer(tokenizer=tokenize)

example = "Jochen Schweizer ist eines der interessantesten Unternehmen der Welt, hat den Sitz allerdings nicht in der Schweizerischen Eidgenossenschaft."
transformer.fit([example])

# Example of the tokenizer
print(tokenize(example))

这个分词器的一个缺陷是它拆分了属于一起的词:“Jochen Schweizer”和“schweizerische Eidgenossenschaft”。也缺少词形还原(词干)。我想获得以下令牌:

["Jochen Schweizer", "interessantesten", "unternehmen", "Welt", "Sitz", "allerdings", "nicht", "Schweizerische Eidgenossenschaft"]

我知道 Spacy 可以识别那些命名实体 (NER):

import en_core_web_sm  # python -m spacy download en_core_web_sm --user
parser = en_core_web_sm.load()
doc = parser(example)
print(doc.ents)  # (Jochen Schweizer, Welt, Sitz)

有没有一种很好的方法来使用 spacy 以将命名实体单词保持在一起的方式进行标记?

【问题讨论】:

由于您使用德语而不是英语,因此使用德语模型可能会更好(例如parser = spacy.load('de_core_news_sm') 【参考方案1】:

这个怎么样:

with doc.retokenize() as retokenizer:
    for ent in doc.ents:
        retokenizer.merge(doc[ent.start:ent.end])

事实上,您可以使用 spacy 删除标点符号和停用词,也可以执行词形还原!

parser = spacy.load('de_core_news_sm')
def tokenize(text):
    doc = parser(text)
    with doc.retokenize() as retokenizer:
        for ent in doc.ents:
            retokenizer.merge(doc[ent.start:ent.end], attrs="LEMMA": ent.text)
    return [x.lemma_ for x in doc if not x.is_punct and not x.is_stop]

例子:

>>> text = "Jochen Schweizer ist eines der interessantesten Unternehmen der Welt, hat den Sitz allerdings nicht in der Schweizerischen Eidgenossenschaft."
>>> print(tokenize(text))
>>> [u'Jochen Schweizer', u'interessant', u'Unternehmen', u'Welt', u'Sitz', u'Schweizerischen Eidgenossenschaft']

【讨论】:

以上是关于如何将标记化中的多词名称保持在一起?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定在 SwiftUI 中的多词文本视图中点击的词

如何合并多词NER标签?

使用 AGM 拖动地图时如何将 Google 地图标记保持在中心?

如何在使用新地图刷新之前清除谷歌地图标记? [复制]

Bing地图WPF添加位置标记

垃圾回收