如何在Python中取消单词?

sil*_*dev 7 python nlp nltk

我想知道我是否可以将它们解除为正常状态?

问题是我有成千上万的不同形式的单词,例如吃,吃,吃,吃等等,我需要计算每个单词的频率.所有这些 - 吃,吃,吃,吃等都会计入吃,因此,我使用了茎.

但问题的下一部分要求我在数据中找到相似的单词,我使用nltk的同义词来计算单词中的Wu-Palmer相似度.问题是nltk的同义词不会对词干词起作用,或者至少在这段代码中它们不会.检查两个单词是否相互关联

我该怎么办?有没有办法解除一个字?

yve*_*man 5

不,没有。通过词干提取,您不仅会丢失有关单词形式的信息(如 eat 与 eats 或 eated),还会丢失有关单词本身的信息(如在传统与传统中)。除非您打算使用预测方法来尝试根据单词的上下文来预测此信息,否则无法将其恢复。


Raf*_*ero 5

我认为一个好的方法就像在/sf/answers/2146969541/ 中所说的那样。

一个可能的实现可能是这样的:

import re
import string
import nltk
import pandas as pd
stemmer = nltk.stem.porter.PorterStemmer()
Run Code Online (Sandbox Code Playgroud)

要使用的词干分析器。这里有一段文字要使用:

complete_text = ''' cats catlike catty cat 
stemmer stemming stemmed stem 
fishing fished fisher fish 
argue argued argues arguing argus argu 
argument arguments argument '''
Run Code Online (Sandbox Code Playgroud)

用不同的词创建一个列表:

my_list = []
#for i in complete_text.decode().split():
try: 
    aux = complete_text.decode().split()
except:
    aux = complete_text.split()
for i in aux:
    if i not in my_list:
        my_list.append(i.lower())
my_list
Run Code Online (Sandbox Code Playgroud)

带输出:

['cats',
 'catlike',
 'catty',
 'cat',
 'stemmer',
 'stemming',
 'stemmed',
 'stem',
 'fishing',
 'fished',
 'fisher',
 'fish',
 'argue',
 'argued',
 'argues',
 'arguing',
 'argus',
 'argu',
 'argument',
 'arguments']
Run Code Online (Sandbox Code Playgroud)

现在创建字典:

aux = pd.DataFrame(my_list, columns =['word'] )
aux['word_stemmed'] = aux['word'].apply(lambda x : stemmer.stem(x))
aux = aux.groupby('word_stemmed').transform(lambda x: ', '.join(x))
aux['word_stemmed'] = aux['word'].apply(lambda x : stemmer.stem(x.split(',')[0]))
aux.index = aux['word_stemmed']
del aux['word_stemmed']
my_dict = aux.to_dict('dict')['word']
my_dict
Run Code Online (Sandbox Code Playgroud)

哪个输出是:

{'argu': 'argue, argued, argues, arguing, argus, argu',
 'argument': 'argument, arguments',
 'cat': 'cats, cat',
 'catlik': 'catlike',
 'catti': 'catty',
 'fish': 'fishing, fished, fish',
 'fisher': 'fisher',
 'stem': 'stemming, stemmed, stem',
 'stemmer': 'stemmer'}
Run Code Online (Sandbox Code Playgroud)

配套笔记本在这里


ste*_*eve 2

我怀疑你所说的“词干”真正的意思是“紧张”。就像您希望每个单词的不同时态分别计入动词的“基本形式”一样。

查看pattern包裹

pip install pattern
Run Code Online (Sandbox Code Playgroud)

然后使用 en.lemma 函数返回动词的基本形式。

import pattern.en as en
base_form = en.lemma('ate') # base_form == "eat"
Run Code Online (Sandbox Code Playgroud)