65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 中的西班牙语词干提取器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2014年5月23日

CPOL

5分钟阅读

viewsIcon

16480

downloadIcon

309

这是一个用 C# 编写的西班牙语词干提取器。这是我的第一个尝试,基于 Snowball 网站上定义的规则。

引言

语言形态学信息检索中,词干提取是将屈折(有时是派生)词还原为其词干、基础或词根形式的过程—通常是书面的单词形式。词干不必与单词的形态学词根相同;通常足以使相关词映射到相同的词干,即使该词干本身不是有效的词根。算法的词干提取自 20 世纪 60 年代以来在计算机科学领域得到了研究。许多搜索引擎将具有相同词干的词视为一种同义词,这一过程称为合并。” 维基百科

我一直在寻找西班牙语词干提取的 C# 代码,但一无所获。好吧,那就来写代码吧!……这是结果。这是一个用 C# 编写的西班牙语词干提取器。这是我的第一个尝试,基于 Snowball 网站上定义的规则。词干处理的方法遵循下面定义的步骤


词干提取算法

西班牙语字母包括以下带音标的字母:
á é í ó ú ü ñ
以下字母是元音
a e i o u á é í ó ú ü

R1 和 R2 定义如下:

R1 是第一个元音后面的第一个辅音之后的区域,或者在没有这样的辅音的情况下,是词末的空区域。

R2 是 R1 中第一个元音后面的第一个辅音之后的区域,或者在没有这样的辅音的情况下,是词末的空区域。

RV 定义如下:

如果第二个字母是辅音,RV是下一个元音之后的区域,或者如果前两个字母是元音,RV是下一个辅音之后的区域,否则(辅音-元音情况),RV是第三个字母之后的区域。但如果找不到这些位置,RV就是词的末尾。

例如,

    m a c h o     o l i v a     t r a b a j o     á u r e o
         |...|         |...|         |.......|         |...|
始终执行步骤 0 和 1。

步骤 0:附加代词
搜索以下后缀中最长的,并将其删除,如果它出现在以下之一之后:
me se sela selo selas selos la le lo las les los nos

并在 RV 中。如果出现在
(a) iéndo ándo ár ér ír
(b) ando iendo ar er ir
(c) yendo 后面跟着 u

的情况下。对于 (c),yendo 必须位于 RV 中,但前面的 u 可以不在 RV 中。

对于 (a),删除后会去掉重音符号(例如,haciéndola->haciendo)。
步骤 1:标准后缀移除
搜索以下后缀中最长的,并执行指示的操作。
anza anzas ico ica icos icas ismo ismos able ables ible ibles ista istas oso osa osos osas amiento amientos imiento imientos
如果位于 R2 中,则删除
adora ador ación adoras adores aciones ante antes ancia ancias
如果位于 R2 中,则删除
如果前面是 ic,则在 R2 中删除
logía logías
如果位于 R2 中,则替换为 log
ución uciones
如果位于 R2 中,则替换为 u
encia encias
如果位于 R2 中,则替换为 ente
amente
如果位于 R1 中,则删除
如果前面是 iv,则在 R2 中删除(如果前面是 at,则在 R2 中删除),否则,
如果前面是 osicad,则在 R2 中删除
mente
如果位于 R2 中,则删除
如果前面是 anteableible,则在 R2 中删除
idad idades
如果位于 R2 中,则删除
如果前面是 abiliciv,则在 R2 中删除
iva ivo ivas ivos
如果位于 R2 中,则删除
如果前面是 at,则在 R2 中删除
如果步骤 1 没有删除任何结尾,则执行步骤 2a

步骤 2a:以y开头的动词后缀
在 RV 中搜索以下后缀中最长的,如果找到,则在前面有 u 的情况下删除。
ya ye yan yen yeron yendo yo yó yas yes yais yamos

(请注意,前面的 u 不一定在 RV 中。)
如果步骤 2a执行了但未能删除后缀,则执行步骤 2b

步骤 2b:其他动词后缀
在 RV 中搜索以下后缀中最长的,并执行指示的操作。
en es éis emos
删除,如果前面是 gu,则删除 u (gu 不一定在 RV 中)
arían arías arán arás aríais aría aréis aríamos aremos ará aré erían erías erán erás eríais ería eréis eríamos eremos erá eré irían irías irán irás iríais iría iréis iríamos iremos irá iré aba ada ida ía ara iera ad ed id ase iese aste iste an aban ían aran ieran asen iesen aron ieron ado ido ando iendo ió ar er ir as abas adas idas ías aras ieras ases ieses ís áis abais íais arais ierais aseis ieseis asteis isteis ados idos amos ábamos íamos imos áramos iéramos iésemos ásemos
删除
始终执行步骤 3。

步骤 3:剩余后缀
在 RV 中搜索以下后缀中最长的,并执行指示的操作。
os a o á í ó
如果在 RV 中,则删除
e é
如果在 RV 中,则删除,并且如果前面是 guu 在 RV 中,则删除 u
最后
移除重音符号

使用代码

有两个项目。

  1. 西班牙语词干提取器类库
  2. 测试项目(我不会详细介绍,因为它非常简单)

类库包含两个类:StemmerSpecials。Specials 包含 Stemmer 类用于解析输入单词的术语列表,并包含西班牙语中的特殊单词。Stemmer 是执行工作的类。Execute 方法接收一个单词并返回其词干。此方法可选择接收一个布尔变量 (useStopWords) 来选择是否在词干提取过程中包含一些西班牙语的特殊单词。当单词是 Specials.stop_words 列表中的一个时,则返回整个单词。

useStopWord 为 false 或输入单词不在 Specials.stop_words 中时,过程是:

  1. 计算 R1、R2 和 RV,按定义计算。
  2. 计算步骤 0。
  3. 计算步骤 1。
  4. 如果步骤 1 没有移除任何结尾,则计算步骤 2a。
  5. 如果步骤 2a 执行但未移除任何后缀,则计算步骤 2b。
  6. 计算步骤 3
  7. 移除重音符号
  8. 返回输入单词的词干结果


有趣的亮点

我尝试生成 ICD-9 的词干分类目录,结果很棒。尽情享用吧!

© . All rights reserved.