我是一个新的文本分析,需要您的建议,以帮助医学生正确和正确的写作。学生在观察疾病时描述疾病,但是,他们必须使用“正式的疾病描述”。我有从学生那里收集的数据和正确的数据。让我解释一下:
我有一个包含300 K行/一列的csv table1 :每一行都是学生编写的健康状况描述(它们可能是多余的)。
我有另一个包含近200 K行和3列的table2,第1列:条件的正式名称(学生应该使用的正确名称)列2:代码(数字)列3:用另一种语言翻译“条件的正式名称”。
其想法是从table1开始,并将每一行与N个正式名称(以及它们的代码和翻译)匹配。让我们假设5个官方名称按距离计算排名。
我很困惑:我应该选择推荐引擎还是搜索/排名算法?
您可以确定完成此任务的步骤是什么?
PS:最后的输出可能是一个API,学生开始写疾病的描述,并获得一个选择/建议的列表,他们可以从中选择一个。我希望我说的很清楚!谢谢
发布于 2018-01-11 08:52:00
谢谢你,我一定要测试FuzzyWuzzy自选。同时,请看我昨天所做的代码(可以增强,如果你能做得更好的话,请继续:-
#define function to read the CSV files
def GetDocument(link):
dataframe = pd.read_csv(link, encoding = "ISO-8859-1", sep = ';')
return dataframe
#define function convert text/CSV data to lists
def ColumnToList(column):
return column.tolist()
#read document csv
document1 = GetDocument('C:/Users/smegrhi/Desktop/DOC1.csv')
document2 = GetDocument('C:/Users/smegrhi/Desktop/DOC2.csv')
#get columns into lists
list1 = ColumnToList(document1['DIA_LBL'])
list2 = ColumnToList(document2['ICD10_LBL_FR'])
#Data pre-processing
def ProcessText(sentence):
#Convert to lower case
sentence = sentence.lower()
#Convert www.* or https?://* to URL
sentence = re.sub('((www\.[^\s]+)|(https?://[^\s]+))','',sentence)
#Convert
sentence = re.sub('@[^\s]+','',sentence)
#Remove additional white spaces
sentence = re.sub('[\s]+', ' ', sentence)
#Replace
sentence = re.sub(r'#([^\s]+)', r'\1', sentence)
return sentence
#execute
for i,text in enumerate(list1):
res = ProcessText(text)
list1[i] = res
#vectorize the data
WORD = re.compile(r'\w+')
#function vectorize data
def text_to_vector(text):
words = WORD.findall(text)
return Counter(words)
#calculate similarity
def get_cosine(vec1, vec2):
intersection = set(vec1.keys()) & set(vec2.keys())
numerator = sum([vec1[x] * vec2[x] for x in intersection])
sum1 = sum([vec1[x]**2 for x in vec1.keys()])
sum2 = sum([vec2[x]**2 for x in vec2.keys()])
denominator = math.sqrt(sum1) * math.sqrt(sum2)
if not denominator:
return 0.0
else:
return float(numerator) / denominator
# compare sentence from list 1 with list 2 : Choose Indication from Data/DOC1
text1 = list1[1]
#text1 = shigellose à shigella dysenteriae
vector1 = text_to_vector(text1)
listCosine = []
for i,text in enumerate(list2):
vector2 = text_to_vector(text)
cosine = get_cosine(vector1, vector2)
listCosine.append(cosine)结果也没那么糟,也没那么好.你的建议?
发布于 2018-01-10 17:50:06
为此,FuzzyWuzzy将是一个很好的python库。来自GitHub自述的代码示例:
>>> choices = ["Atlanta Falcons", "New York Jets", "New York Giants", "Dallas Cowboys"]
>>> process.extract("new york jets", choices, limit=2)
[('New York Jets', 100), ('New York Giants', 78)]
>>> process.extractOne("cowboys", choices)
("Dallas Cowboys", 90)我想您希望使用限制为5的extract函数,并将choices设置为table2 csv文件中的所有“正式名称”。
有关安装和使用的详细信息见上面的链接。
发布于 2018-01-11 05:09:40
其想法是从table1开始,并将每一行与N个正式名称(以及它们的代码和翻译)匹配。让我们假设5个官方名称按距离计算排名。
我建议不要使用ML分类器,因为如果只返回5个选项,您可能会排除一些200k官方名称。
有许多模糊文本匹配算法来匹配您的行与官方名称。FuzzyWuzzy's和其他几种算法都是基于利文希丁距离的。你可以使用for -循环来检查200k的官方名称。这可能需要一段时间。对必须低分数的列表和片/弹值进行排序,你将得到排在前5位的最佳匹配的官方名称。我想你希望对每个官方名称的频率进行排序,并作为第一结果返回最高的排名。
因为学生给出的健康描述可能是多余的,所以您可能需要运行一个Zipf排序算法来过滤更多常见的单词。
这就是答案还远未完成。欢迎提出意见。
https://datascience.stackexchange.com/questions/26479
复制相似问题