苹果自然语言框架中的不良词化

时间:2019-08-18 09:46:08

标签: ios macos nlp lemmatization

我做了一个快速实验,检查了苹果自然语言框架中词形化的准确性,结果很差。

我想知道我做错了什么还是框架真的那么糟糕。

在实验中,我直接使用了Apple文档中的代码(在我可以找到的一些在线示例中也重复了这些代码。)

let tagger = NLTagger(tagSchemes: [.lemma])
tagger.string = text
let options: NLTagger.Options = [.omitPunctuation, .omitWhitespace]
tagger.enumerateTags(in: text.startIndex..<text.endIndex, unit: .word, scheme: .lemma, options: options) { tag, tokenRange in
    print("\(text[tokenRange]): \(tag?.rawValue ?? "NO LEMMA")")
    return true
}

为了测试输出,我从Euronews文章中摘了一段,该文章有多种语言。

英语版本看似准确,但是在英语中,大多数单词都与它们的引理相吻合,因此它不是一个很好的基准。

我正在macOS 10.14.6上的Xcode Playground中运行代码。我尝试了 macOS iOS 作为游乐场的平台,这没有什么区别。

let text = "For the possible necessity of short-time work I want to make sure to build an incentive with connecting it to training. And I want Germany to be able to implement short-time work faster in case of a fast recession of the economic situation because of global economic risks."

// Output

For: for
the: the
possible: possible
necessity: necessity
of: of
short: short
time: time
work: work
I: I
want: want
to: to
make: make
sure: sure
to: to
build: build
an: an
incentive: incentive
with: with
connecting: connect
it: it
to: to
training: training
And: and
I: I
want: want
Germany: Germany
to: to
be: be
able: able
to: to
implement: implement
short: short
time: time
work: work
faster: fast
in: in
case: case
of: of
a: a
fast: fast
recession: recession
of: of
the: the
economic: economic
situation: situation
because: because
of: of
global: global
economic: economic
risks: risk

然后我尝试了意大利语,这是我的母语,因此我可以轻松地进行验证。在这里,我开始看到一些问题。

let text = "Voglio assicurare che siano creati degli incentivi nel settore del lavoro a orario ridotto, collegati con periodi di training. E voglio che la Germania sia in grado di incrementare questo tipo di offerta lavorativa in modo veloce, in caso di recessione dell'economia per non farsi travolgere dai rischi che a livello globale subiremmo."

// Output

Voglio: volersi
assicurare: assicurare
che: che
siano: essersi
creati: crearsi
degli: degli
incentivi: incentivo
nel: nel
settore: settore
del: del
lavoro: lavoro
a: a
orario: orario
ridotto: ridotto
collegati: collegarsi
con: con
periodi: periodo
di: di
training: training
E: e
voglio: volersi
che: che
la: la
Germania: Germania
sia: essersi
in: in
grado: grado
di: di
incrementare: incrementare
questo: questo
tipo: tipo
di: di
offerta: offerta
lavorativa: lavorativo
in: in
modo: modo
veloce: veloce
in: in
caso: caso
di: di
recessione: recessione
dell'economia: economia
per: per
non: non
farsi: farsi
travolgere: travolgere
dai: dai
rischi: rischio
che: che
a: a
livello: livello
globale: globale
subiremmo: subire

有些动词在这里出现奇怪的引理:“ volersi”,“ essersi”,“ crearsi”不是这些动词的正确定语形式。由于某种原因,它们处于反身形式。但问题在于,在例句的许多部分中,它们并没有反身使用。

但是,当我尝试俄语(我在中级水平上讲)时,事情真的崩溃了。

let text = "Чтобы быть готовыми к потенциальному появлению необходимости в краткосрочной работе, я хочу создать возможности для обучения. Я хочу, чтобы Германия могла быстро выполнять работу в самые сжатые сроки в случае быстрого спада экономики из-за нависших над ней глобальных рисков."

// Output

Чтобы: чтобы
быть: быть
готовыми: NO LEMMA
к: к
потенциальному: NO LEMMA
появлению: NO LEMMA
необходимости: NO LEMMA
в: в
краткосрочной: NO LEMMA
работе: NO LEMMA
я: я
хочу: NO LEMMA
создать: NO LEMMA
возможности: NO LEMMA
для: для
обучения: NO LEMMA
Я: я
хочу: NO LEMMA
чтобы: чтобы
Германия: Германия
могла: мочь
быстро: NO LEMMA
выполнять: NO LEMMA
работу: NO LEMMA
в: в
самые: самый
сжатые: NO LEMMA
сроки: NO LEMMA
в: в
случае: случай
быстрого: NO LEMMA
спада: спад
экономики: NO LEMMA
из: из
за: за
нависших: NO LEMMA
над: над
ней: ней
глобальных: NO LEMMA
рисков: риск

大多数单词不会引出引理。这些都不是少见的词,我认为它们也不难刻画(但我不是NLP专家)。

例如,单词“быстро”(快速,快速)是前300个最常用的俄语单词之一,它是形容词“быстрый”的副词。这绝对是我期望词完词器能够识别的词。就像“我想要”这个词“хочу”。

意大利的输出已经让我感到困惑,但是俄罗斯的输出肯定无法使用。

我做错什么了吗,还是苹果的框架真的那么糟糕?

1 个答案:

答案 0 :(得分:0)

合法化是一个依赖语言的过程。用于词条抽取的相同模型可能无法在多种语言中给出准确的结果。有问题的lemmatizer可能默认使用英语。

您可以尝试使用NLTagger类中的setLanguage函数为lemmatizer设置正确的语言。 API的详细信息为here.

您可以使用以下方法预测给定文本的语言:

let tagger = NSLinguisticTagger(tagSchemes: [.language], options: 0) 
tagger.string = "NSLinguisticTagger provides text processing APIs." 
let language = tagger.dominantLanguage
相关问题