我想知道我是否可以将它们解除正常状态?
问题是我有数千个不同形式的单词,例如吃,吃,吃,吃等等,我需要计算每个单词的频率。所有这些 - 吃,吃,吃,吃等都会计入吃,因此我使用了茎。
但问题的下一部分要求我在数据中找到相似的单词,而我正在使用nltk的同义词来计算单词中的Wu-Palmer相似度。问题是nltk的同义词不会对词干词起作用,或者至少在这段代码中它们不会。 check if two words are related to each other
我该怎么办?有没有办法解开一个词?
答案 0 :(得分:3)
不,没有。通过词干,你会失去信息,不仅仅是关于单词形式(如吃与吃或吃),还有关于单词本身的信息(如传统与传统)。除非您打算使用预测方法根据单词的上下文尝试预测此信息,否则无法将其取回。
答案 1 :(得分:1)
我怀疑你的真正含义是“紧张”。正如你想要每个单词的不同时态,每个单词都计入动词的“基本形式”。
查看pattern
包
pip install pattern
然后使用en.lemma函数返回动词的基本形式。
import pattern.en as en
base_form = en.lemma('ate') # base_form == "eat"
答案 2 :(得分:0)
理论上,唯一的方法是,如果在词干之前你保留了一个术语词典或任何类型的映射,并将这个映射继续进行你的其余计算。这个映射应该以某种方式捕获未被干扰的令牌的位置,并且当需要保留一个令牌时,如果你知道你的带柄令牌的原始位置,你将能够追溯并恢复你的映射的原始未经过干扰的表示。 / p>
对于Bag of Words表示,这似乎是计算密集型的,并且以某种方式违背了BoW方法的统计性质的目的。
但理论上我再次认为它可行。我在任何实现中都没有看到过。
答案 3 :(得分:0)
我认为一种好的做法就像在https://stackoverflow.com/a/30670993/7127519中说的那样。
可能的实现可能是这样的:
import re
import string
import nltk
import pandas as pd
stemmer = nltk.stem.porter.PorterStemmer()
使用的提取器。这里有一个使用的文字:
complete_text = ''' cats catlike catty cat
stemmer stemming stemmed stem
fishing fished fisher fish
argue argued argues arguing argus argu
argument arguments argument '''
使用不同的单词创建一个列表:
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
带输出:
['cats',
'catlike',
'catty',
'cat',
'stemmer',
'stemming',
'stemmed',
'stem',
'fishing',
'fished',
'fisher',
'fish',
'argue',
'argued',
'argues',
'arguing',
'argus',
'argu',
'argument',
'arguments']
现在创建字典:
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
哪个输出是:
{'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'}
伴侣笔记本here。
答案 4 :(得分:0)
您可能喜欢这个使用Stemming的开源项目,该项目包含一种算法来执行反向Stemming:
在this page of the project上,有关于如何执行反向阻止的说明。总结起来,它的工作方式如下。
首先,您将阻止一些文档,此处是简短的(法语)字符串,其中删除了停用词,例如:
['sup chat march trottoir',
'sup chat aiment ronron',
'chat ronron',
'sup chien aboi',
'deux sup chien',
'combien chien train aboi']
然后,诀窍是保留最流行的原始单词的数量以及每个词干单词的数量:
{'aboi': {'aboie': 1, 'aboyer': 1},
'aiment': {'aiment': 1},
'chat': {'chat': 1, 'chats': 2},
'chien': {'chien': 1, 'chiens': 2},
'combien': {'Combien': 1},
'deux': {'Deux': 1},
'march': {'marche': 1},
'ronron': {'ronronner': 1, 'ronrons': 1},
'sup': {'super': 4},
'train': {'train': 1},
'trottoir': {'trottoir': 1}}
最后,您现在可以猜测如何自行实现。只需使用词干词最多的原始词即可。您可以参考以下实现,该实现在MIT许可下作为Multilingual-Latent-Dirichlet-Allocation-LDA项目的一部分提供:
可以通过抛弃非最上面的反向单词(例如,使用堆)来进行改进,这将最终只产生一个字典而不是字典。