我想知道我是否可以将它们解除为正常状态?
问题是我有成千上万的不同形式的单词,例如吃,吃,吃,吃等等,我需要计算每个单词的频率.所有这些 - 吃,吃,吃,吃等都会计入吃,因此,我使用了茎.
但问题的下一部分要求我在数据中找到相似的单词,我使用nltk的同义词来计算单词中的Wu-Palmer相似度.问题是nltk的同义词不会对词干词起作用,或者至少在这段代码中它们不会.检查两个单词是否相互关联
我该怎么办?有没有办法解除一个字?
不,没有。通过词干提取,您不仅会丢失有关单词形式的信息(如 eat 与 eats 或 eated),还会丢失有关单词本身的信息(如在传统与传统中)。除非您打算使用预测方法来尝试根据单词的上下文来预测此信息,否则无法将其恢复。
我认为一个好的方法就像在/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)
配套笔记本在这里。
我怀疑你所说的“词干”真正的意思是“紧张”。就像您希望每个单词的不同时态分别计入动词的“基本形式”一样。
查看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)
归档时间: |
|
查看次数: |
4859 次 |
最近记录: |