自然语言处理(NLP),尤其是英语,已经发展成为如果存在"完美"的引理词,词干将成为一种古老技术的阶段.这是因为词干分析器将单词/标记的表面形式改变为一些无意义的词干.
然后,"完美"变形器的定义是值得怀疑的,因为不同的NLP任务需要不同级别的词形还原.例如,在动词/名词/形容词形式之间转换单词.
词干
[in]: having
[out]: hav
Run Code Online (Sandbox Code Playgroud)
Lemmatizers
[in]: having
[out]: have
Run Code Online (Sandbox Code Playgroud)
所以问题是,英语词干器今天有用吗?因为我们有大量的英语词汇化工具
如果不是,那么我们应该如何着手构建强大的lemmatizers可以取nounify,verbify,adjectify和adverbify
预处理?
如何将词形还原任务轻松扩展到与英语具有相似形态结构的其他语言?
我需要一段文字并从中提取一个"标签"列表.其中大部分都很直接.但是我现在需要一些帮助来阻止生成的单词列表以避免重复.示例:社区/社区
我已经使用了Porter Stemmer算法的实现(顺便说一下我在PHP中编写):
http://tartarus.org/~martin/PorterStemmer/php.txt
这可以达到一定程度,但不会返回"真实"的单词.上面的例子被称为"commun".
我尝试过"Snowball"(在另一个Stack Overflow线程中建议).
http://snowball.tartarus.org/demo.php
对于我的例子(社区/社区),Snowball源于"社交".
题
有没有其他干扰算法可以做到这一点?还有其他人解决了这个问题吗?
我目前的想法是,我可以使用词干算法来避免重复,然后选择我遇到的最短词是要显示的实际词.
我有像下面这样的python列表
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
Run Code Online (Sandbox Code Playgroud)
现在我需要阻止它(每个单词)并得到另一个列表.我怎么做 ?
获得动词过去时的最有效方法是什么,最好不使用内存繁重的NLP框架?
例如
我自己写了一些东西(堆栈溢出不会让我自己回答)这似乎适用于常规动词(例如该列表的前4个),但不是不规则的动词:http://pastebin.com/Txh76Dnb
编辑:感谢所有的回复,看起来由于不规则的动词,没有字典就无法正常完成.
词干是标记系统所需要的.我使用美味,我没有时间管理和修剪我的标签.我对我的博客更加小心,但它并不完美.我为嵌入式系统编写软件,如果它们包括词干,它将更加实用(对用户有帮助).
例如:
Parse
Parser
Parsing
对于我所投入的任何系统,所有这些都意味着同样的事情.
理想情况下,某处有一个BSD许可的词干分析器,但如果没有,我在哪里可以学习常见的算法和技术?
除了BSD词干分析器之外,还有哪些其他开源许可的词干分析器?
-亚当
我使用python模式来获得单数形式的英语名词.
In [1]: from pattern.en import singularize
In [2]: singularize('patterns')
Out[2]: 'pattern'
In [3]: singularize('gases')
Out[3]: 'gase'
Run Code Online (Sandbox Code Playgroud)
我通过定义来解决第二个例子中的问题
def my_singularize(strn):
'''
Return the singular of a noun. Add special cases to correct pattern generic rules.
'''
exceptionDict = {'gases':'gas','spectra':'spectrum','cross':'cross','nuclei':'nucleus'}
try:
return exceptionDict[strn]
except:
return singularize(strn)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点,例如添加到模式规则,或以exceptionDict某种方式使模式内部?
有没有可以执行以下操作的软件?
给出一个英文句子
"他喜欢烤豆",
我将"他"改为"我",句子改为
"我喜欢烤豆"
(注意S)
要么
"她的头发扎成马尾辫"
我将"她"改为"他",句子改为
"他的头发扎成马尾辫".
同样,可以将句子改为过去时态,
"她的头发扎成马尾辫".
这样的软件是否存在?
我需要构建一个php字典,它将找到一个单词的根词.防爆.搜索"汽车",它会告诉"汽车是复数汽车"或"拿走",它是"过去时的拍摄"
我正在考虑使用Wordnet,但它似乎很复杂.
有什么建议吗?我绝望了
问候;
我一直致力于与twitter情绪分析相关的研究.我对如何在Python上编码有一点了解.由于我的研究与编码有关,我已经做了一些关于如何使用Python分析情绪的研究,以下是我走了多远:1.推文的标记2.令牌的POS标记,剩下的是计算正和我现在面临的问题的情绪消极,需要你的帮助.
下面是我的代码示例:
import nltk
sentence = "Iphone6 camera is awesome for low light "
token = nltk.word_tokenize(sentence)
tagged = nltk.pos_tag(token)
Run Code Online (Sandbox Code Playgroud)
因此,我想问一下是否有人可以帮我展示/指导使用python编写关于sentiwordnet的代码来计算已经被POS标记的tweeets的正面和负面分数.预先感谢
如何检测字符串后缀并从列表中删除这些后缀元素? 我知道这看起来像NLP,词干/词形还原任务,但任务需要更简单的功能.
给定,如果列表中存在非后缀项,我需要删除具有s和es后缀的元素:
alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
Run Code Online (Sandbox Code Playgroud)
我需要输出:
alist = ['bar','barbar','foo','foofoos']
Run Code Online (Sandbox Code Playgroud)
我已经尝试了以下但是它不起作用,因为当我整理出来时,它['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']没有['bar', 'bares', 'barbar', 'barbares', 'foo', 'foos', 'foofoos']
alist = ['bar','barbar','foo','foos','barbares','foofoos','bares']
prev = ""
no_s_list = []
for i in sorted(alist):
if i[-2:] == "es" and i[:-2] == prev:
continue
elif i[-1:] == "s" and i[:-1] == prev:
contine
else:
prev = i
no_s_list.append(i)
Run Code Online (Sandbox Code Playgroud)
以上输出:
>>> sorted(alist)
['bar', 'barbar', 'barbares', 'bares', 'foo', 'foofoos', 'foos']
Run Code Online (Sandbox Code Playgroud) 我注意到在应用 Porter 词干(来自 NLTK 库)后,我得到了奇怪的词干,例如"cowardli"或"contrari"。对我来说,它们根本不像茎。
没关系吗?难道是我哪里弄错了?
这是我的代码:
string = string.lower()
tokenized = nltk.tokenize.regexp_tokenize(string,"[a-z]+")
filtered = [w for w in tokenized if w not in nltk.corpus.stopwords.words("english")]
stemmer = nltk.stem.porter.PorterStemmer()
stemmed = []
for w in filtered:
stemmed.append(stemmer.stem(w))
Run Code Online (Sandbox Code Playgroud)
这是我用于处理http://pastebin.com/XUMNCYAU的文本(Dostoevsky 的“罪与罚”一书的开头)。