[英]Bigram detection: Comparing a string with a list in order to merge certain substrings
考慮到我有一個字符串:
text = "You are good at data mining and machine learning"
以及可能的二元組列表:
bigrams = ["data mining", "machine learning"]
如何檢測文本中的那些二元組並將兩個單詞合並在一起,這樣我的結果將是一個字符串,如:
new_text = "You are good at data_mining and machine_learning"
我需要將其應用於更大的字符串(語料庫)和更長的雙字母組列表。
我在string.replace()中嘗試了它:
new_text = [x.replace(" ","_") for x in text if x in bigrams]
但這導致一個空列表。
您可以使用優雅的方式進行操作,例如:
input_list = text.split(" ")
def ngrams(input_list, n):
return zip(*[input_list[i:] for i in range(n)])
在這種情況下,n應為2。 這將返回一個包含所有bigram組合的元組列表。 之后,您可以簡單地使用列表推導再次連接每個元組
list_of_bigrams = [bigram[0] + "_" + bigram[1] for bigram in ngrams(input_list,2)]
這使用re
和調用replace將空格轉換為僅在匹配克上的下划線。
>>> import re
>>> bigrams = ["data mining", "machine learning"]
>>> text = "You are good at data mining and machine learning"
>>> re.sub('('+'|'.join('\\b'+re.escape(g)+'\\b' for g in bigrams)+')',
... lambda m: m.group(0).replace(' ', '_'), text)
'You are good at data_mining and machine_learning'
理想情況下,這是最有效的解決方案,因為找到字符串中的一組字符串的不重疊現象可以及時完成,這主要取決於字符串的長度,而不是字符串組的大小,一旦確定被前綴索引。
最簡單的方法是:
for bigram in bigrams:
text = text.replace(bigram, "_".join(split(bigram)))
或如克里斯所說
for bigram in bigrams:
text = text.replace(bigram, bigram.replace(" ", "_"))
我不確定哪個更快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.