如何在Python中取消单词?

时间:2015-05-15 18:34:45

标签: python nlp nltk

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

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

但问题的下一部分要求我在数据中找到相似的单词,而我正在使用nltk的同义词来计算单词中的Wu-Palmer相似度。问题是nltk的同义词不会对词干词起作用,或者至少在这段代码中它们不会。 check if two words are related to each other

我该怎么办?有没有办法解开一个词?

5 个答案:

答案 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)

tl; dr:您可以使用所需的任何词干(例如:Snowball),并在通过计算出现次数为每个词干词干之前跟踪哪个词最受欢迎。

您可能喜欢这个使用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项目的一部分提供:

可以通过抛弃非最上面的反向单词(例如,使用堆)来进行改进,这将最终只产生一个字典而不是字典。