簡體   English   中英

在python上查找字符串中單詞的變體

[英]find variations of a word in a string on python

所以,我正在運行Python 3.3.2,我有一個字符串(句子,段落):

mystring=["walk walked walking talk talking talks talked fly flying"]

我有另一個列表,其中包含我需要在該字符串中搜索的單詞:

list_of_words=["walk","talk","fly"]

我的問題是,有沒有辦法得到結果:

  1. 單詞walk或變體出現3次
  2. 單詞talk或變體出現4次
  3. 單詞fly或變體出現2次

最重要的是,是否可以計算一個單詞的所有可能變體?

一種方法可能是用空格分割字符串,然后查找包含要為其找到變體的特定單詞的所有單詞。

例如:

def num_variations(word, sentence):
    return sum(1 for snippit in sentence.split(' ') if word in snippit)

for word in ["walk", "talk", "fly"]:
    print word, num_variations(word, "walk walked walking talk talking talks talked fly flying")

然而,這種方法有點幼稚,不會理解英語形態。 例如,使用此方法,“fly”將不匹配“蒼蠅”。

在這種情況下,您可能需要使用某種自然語言庫來配備一個體面的字典來捕獲這些邊緣情況。

您可能會發現此答案很有用。 它通過使用NLTK庫找到單詞的詞干(刪除復數,不規則拼寫等)然后使用類似於上面的方法對它們求和來完成類似的事情。 但是,根據您正在嘗試完成的內容,它可能對您的情況有些過分。

from difflib import get_close_matches
mystring="walk walked walking talk talking talks talked fly flying"
list_of_words=["walk","talk","fly"]

sp = mystring.split()
for x in list_of_words:
    li = [y for y in get_close_matches(x,sp,cutoff=0.5) if x in y]
    print '%-7s %d in %-10s' % (x,len(li),li)

結果

walk    2  in ['walk', 'walked']
talk    3  in ['talk', 'talks', 'talked']
fly     2  in ['fly', 'flying']

截止值指的是SequenceMatcher計算的相同比率:

from difflib import SequenceMatcher

sq = SequenceMatcher(None)
for x in list_of_words:
    for w in sp:
        sq.set_seqs(x,w)
        print '%-7s %-10s %f' % (x,w,sq.ratio())

結果

walk    walk       1.000000
walk    walked     0.800000
walk    walking    0.727273
walk    talk       0.750000
walk    talking    0.545455
walk    talks      0.666667
walk    talked     0.600000
walk    fly        0.285714
walk    flying     0.200000
talk    walk       0.750000
talk    walked     0.600000
talk    walking    0.545455
talk    talk       1.000000
talk    talking    0.727273
talk    talks      0.888889
talk    talked     0.800000
talk    fly        0.285714
talk    flying     0.200000
fly     walk       0.285714
fly     walked     0.222222
fly     walking    0.200000
fly     talk       0.285714
fly     talking    0.200000
fly     talks      0.250000
fly     talked     0.222222
fly     fly        1.000000
fly     flying     0.666667

我知道這是一個老問題,但我覺得如果不提及NLTK庫這個討論就不會完整,它提供了大量的自然語言處理工具,包括可以很容易地完成這項任務的工具。

基本上,您希望將目標列表中未反射的單詞與mystring中單詞的未反射形式進行比較。 有兩種常見的消除變形的方法(例如-ing -ed -s):詞干或詞形變化。 在英語中,將詞匯縮減為詞典形式的詞匯化通常會更好,但對於這項任務,我認為詞干是正確的。 無論如何,詞干通常更快。

mystring="walk walked walking talk talking talks talked fly flying"
list_of_words=["walk","talk","fly"]

word_counts = {}

from nltk.stem.snowball import EnglishStemmer
stemmer = EnglishStemmer()

for target in list_of_words:
    word_counts[target] = 0

    for word in mystring.split(' '):

        # Stem the word and compare it to the stem of the target
        stem = stemmer.stem(word)        
        if stem == stemmer.stem(target):
            word_counts[target] += 1

print word_counts

輸出:

{'fly': 2, 'talk': 4, 'walk': 3}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM