用于本地语言的python词干词

用于本地语言的python词干词,python,Python,我在使用基于规则的算法对本地语言中的单词进行词干处理时遇到了一些问题。所以任何懂python的人都可以帮助我 在我的语言中,有些单词通过重复前2或3个字符(声音)来实现复数 比如说 Diimaa (root word) ==> Diddiimaa(plural word) Adii (root word) ==> Adadii(plural word) 现在我想让我的程序拒绝第一个例子中的“Did”和第二个例子中的“Ad” 下面是我的代码,它没有返回任何结果 `def com

我在使用基于规则的算法对本地语言中的单词进行词干处理时遇到了一些问题。所以任何懂python的人都可以帮助我

在我的语言中,有些单词通过重复前2或3个字符(声音)来实现复数

比如说

Diimaa (root word)  ==> Diddiimaa(plural word)
Adii (root word)   ==> Adadii(plural word)
现在我想让我的程序拒绝第一个例子中的“Did”和第二个例子中的“Ad”

下面是我的代码,它没有返回任何结果

`def compput(mm):   
    vv=1
    for i in mm:
        if seevowel(i)==1:
            inxt=mm.index(i)+1
            if inxt<len(mm)-1 and seevowel(mm[inxt])==0: 
                vv=vv+1            
    return vv
def stemm_maker(tkn):
    for i in range(len(tkn)):
        if (i[0] == i[2] and i[1] == i[3]):
            stem = i[2:]
            if compput(stem) > 0:
                return stem
        elif ((i[0] == i[2] or i[0]== i[3]) and i[1] == i[4]):
            stem = i[3:]
            if compput(self) > 0:
                return stem
       else:
           return tkn
    print(stem)`
`def compput(毫米):
vv=1
对于以mm为单位的i:
如果见元音(i)==1:
inxt=mm.索引(i)+1
如果inxt 0:
回油杆
elif((i[0]==i[2]或i[0]==i[3])和i[1]==i[4]):
阀杆=i[3:]
如果compput(self)>0:
回油杆
其他:
返回tkn
打印(干)`

解决此问题的一种方法是使用正则表达式

查看这些配对(已找到):

规则似乎是正确的

if the word starts with XY...
then the reduplicated word is either XYXY... or XYXXY...
在正则表达式语言中,这可以表示为

^(.)(.)\1?(?=\1\2)
这意味着:

 char 1
 char 2
 maybe char 1
 followed by
    char 1
    char 2
完整示例:

test = {
    'adadii': 'adii',
    'babaxxee': 'baxxee',
    'babbareedaa': 'bareedaa',
    'diddiimaa': 'diimaa',
    'gaggaarii': 'gaarii',
    'guguddaa': 'guddaa',
    'hahhamaa': 'hamaa',
    'hahapphii': 'happhii',
}

import re

def singularize(word):
    m = re.match(r'^(.)(.)\1?(?=\1\2)', word)
    if m:
        return word[len(m.group(0)):]
    return word

for p, s in test.items():
    assert singularize(p) == s

这是我在这个页面上发布的问题的答案。我尝试了以下基于规则的代码,它工作正常。我已经用分配给jechoota的单词检查了我的代码

jechoota = "diddiimaa adadii babaxxee babbareedaa gaggaarii guguddaa hahhamaa hahapphii"

token = jechoota.split()
def stem(word):
    if(word[0] == word[2] and word[1] == word[3]):
        stemed = word[2:]
    elif(word[0] == word[2] and word[0] == word[3] and word[1] == word[4]):
        stemed = word[3:]
    return stemed
for i in token:
    print stem(i)

请考虑给你的变量提供一些有用的名字…我不明白你想要什么。您是否已经有Aadii->Adadii并希望进一步处理它?请明确说明什么是输入和预期输出(以及什么是实际输出)我希望adii在处理Adadii后作为根字,即删除前两个字符“Ad”不必担心案例您的示例显示的案例比您描述的更复杂。Diimaa->diddimaa不仅重复前两个字符,还引入了一个额外的“d”。Aadii->Adadii在前两个“a'-s”之间插入一个“d”。那么,具体的规则是什么?还有以字母重复开头的单数词吗?(解析自然语言相当困难。)是的!但通过if-else的方法,我试着把这个例外。我的问题是,如果字符等于2索引处的字符,我如何将其置于0索引处,即I[0]的值==I[2]的值,如果我在测试中查找,这是基于字典的,而不是基于规则的。有些人认为,由于有很多这样的单词,所以很难把所有的单词都测试出来。不管怎样,这是非常有趣的。坦克斯
jechoota = "diddiimaa adadii babaxxee babbareedaa gaggaarii guguddaa hahhamaa hahapphii"

token = jechoota.split()
def stem(word):
    if(word[0] == word[2] and word[1] == word[3]):
        stemed = word[2:]
    elif(word[0] == word[2] and word[0] == word[3] and word[1] == word[4]):
        stemed = word[3:]
    return stemed
for i in token:
    print stem(i)