Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何匹配单词,无论是时态还是形式?_Python_Nlp_Nltk_String Matching - Fatal编程技术网

Python 我如何匹配单词,无论是时态还是形式?

Python 我如何匹配单词,无论是时态还是形式?,python,nlp,nltk,string-matching,Python,Nlp,Nltk,String Matching,我目前正在编写一个脚本,该脚本在文档中运行,提取所有关键字,然后尝试将这些关键字与在其他文档中找到的关键字进行匹配。有一些细节使问题复杂化,但它们与我的问题不太相关。基本上,我希望能够匹配单词,无论它们出现在什么时态 例如:如果给定字符串“swim”、“swam”和“swiming”,我希望有一个程序能够识别出这些都是同一个单词,尽管它是否将单词存储为swim、swam或swiming对我来说并不重要 我知道这个问题可以通过一个包含所有这些单词形式的字典来解决,但我不知道有哪一个字典是以这种方式

我目前正在编写一个脚本,该脚本在文档中运行,提取所有关键字,然后尝试将这些关键字与在其他文档中找到的关键字进行匹配。有一些细节使问题复杂化,但它们与我的问题不太相关。基本上,我希望能够匹配单词,无论它们出现在什么时态

例如:如果给定字符串“swim”、“swam”和“swiming”,我希望有一个程序能够识别出这些都是同一个单词,尽管它是否将单词存储为swim、swam或swiming对我来说并不重要

我知道这个问题可以通过一个包含所有这些单词形式的字典来解决,但我不知道有哪一个字典是以这种方式映射的,对这个问题很有用。我更喜欢与Python兼容的解决方案或库,因为这是我目前用于编写脚本的方法,但我可以使用任何语言的解决方案(除了haskell或eiffel或类似晦涩/难以使用的语言)

签出


从你的问题来看,听起来你在寻找一种词干化柠檬化算法,它基本上将每个单词映射到它的字典形式。其中一个著名的算法是波特词干算法,它已经存在了三十年,并且有多种语言的实现,包括Python。您可以在中找到这些实现的列表


虽然Porter stemmer已经存在很长时间了,出于比较的原因可能会很有用,但Spaceghost正确地指出,这不一定是可用的最佳系统。应该比Porter词干分析算法更好。

您描述的这个问题似乎是一个词干分析问题,它们是一些有用的词干分析工具,就像Porter词干分析工具一样。更具体地说,请尝试使用用于Python的nltk工具包来实现它,如果我没有弄错的话,它附带了一个porter词干分析器。

谢谢!可能值得注意的是,pywordnet不再被wordnet更新或支持,但这确实让我想到了自然语言工具包,它是。@SlaterTyranus您的正确答案。pywordnet现在是NLTK的一部分。很高兴它有帮助(如果你对答案感到满意,不要忘了点击这个答案旁边投票区下方的小复选标记来接受它),我很惊讶这个答案真的有帮助。WordNet的词干/词干化功能非常有限(例如,它不会将任何示例“sweeling”等正确解析为其引理或词干)。我还尝试了NLTK中内置的其他词干分析器,包括代码和中的词干分析器,但发现它们不能很好地处理一些标准动词(例如try'walk'),也不能处理您的示例。最后,答案中给出的代码片段是关于语义关系,而不是屈折形式。Wordnet中提供的标准词干化可能是这样的,但nltk也实现了lancaster词干算法,该算法积极地将单词解析为基本词干,尽管它本身可能不是一个单词,它将把上面的所有内容都解析为同一个条目。为NLP的Python工具包NLTK添加了一个标记。波特本人认为这比Snowball“稍差一点”,
>>> N['dog']
dog(n.)
>>> N['dog'].getSenses()
('dog' in {noun: dog, domestic dog, Canis familiaris},
 'dog' in {noun: frump, dog}, 'dog' in {noun: dog},
 'dog' in {noun: cad, bounder, blackguard, dog, hound, heel},
 'dog' in {noun: pawl, detent, click, dog},
 'dog' in {noun: andiron, firedog, dog, dogiron})