簡體   English   中英

雙字檢測:將字符串與列表進行比較,以合並某些子字符串

[英]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.

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